2011-01-19 27 views
3

私は、下の完全なコードを使って写真を撮ることができるアプリを持っています。私の質問は、jpegに格納されているサムネイルにアクセスする方法、または新しいサムネイルを生成する方法です。このクラスにコードを入れたり、イベントやスケジュールに基づいてフォルダをチェックしたり、サムネイルを生成したりする別のクラスを置くことは問題ありません。Androidで写真を撮った後にサムネイルを保存する

具体的には、サムネイルを設定していますが、とにかくサムネイルにアクセスすることはできません。 ExifInterfaceを実装しようとしましたが、手動で写真のサイズを変更しようとしました。他のパラメータをJpeg Exifに入れることができました(緯度と経度の乱数を入れてください)。ファイルを見ると、数字が書かれたことが確認されました。どうもありがとう。

public void surfaceChanged(SurfaceHolder holder,int format, int width, int height) { 
     Camera.Parameters parameters=camera.getParameters(); 

     parameters.setPreviewSize(width, height); 
     parameters.setPictureFormat(PixelFormat.JPEG); 
     parameters.setJpegThumbnailQuality(50); 
     parameters.setJpegThumbnailSize(192, 256); 

     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

は、これは私が試したとのExifインタフェースを使用して失敗したものです:クラスの

   ExifInterface myEI = new ExifInterface(photo.getPath()); 
       byte[] thumbArray = myEI.getThumbnail(); 

       File thumbFolder = new File(appFolder.getPath(), "thumbnails"); 
       if (!thumbFolder.exists()) 
       { 
        thumbFolder.mkdirs(); 
       } 
       File thumbnail=new File(thumbFolder, picFile.getName()); 
       if (thumbnail.exists()) { 
        thumbnail.delete(); 
       } 

       Bitmap bitmap = BitmapFactory.decodeByteArray(thumbArray, 0, thumbArray.length); 
       FileOutputStream fos = openFileOutput(thumbnail.getPath(), MODE_WORLD_READABLE); 
       bitmap.compress(CompressFormat.JPEG, 50, fos); 
       fos.close(); 

完全なコード。

public class PictureTaker extends Activity { 
private static final String TAG = "PictureTaker"; 
private SurfaceView preview=null; 
private SurfaceHolder previewHolder=null; 
private Camera camera=null; 
String filename; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera); 
    preview=(SurfaceView)findViewById(R.id.preview); 
    previewHolder=preview.getHolder(); 
    previewHolder.addCallback(surfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode==82 || keyCode==KeyEvent.KEYCODE_SEARCH) { 
     takePicture(); 
     return(true); 
    } 
    return super.onKeyDown(keyCode, event); 
} 

private void exitCamera() { 
    finish(); 
    super.onStop(); 
} 

private void takePicture() { 
    camera.takePicture(null, null, photoCallback); 
} 

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     camera=Camera.open(); 

     try { 
      camera.setPreviewDisplay(previewHolder); 
     } 
     catch (Throwable t) { 
      Log.d(TAG, "Exception in setPreviewDisplay()", t); 
     } 
    } 

    public void surfaceChanged(SurfaceHolder holder,int format, int width, int height) { 
     Camera.Parameters parameters=camera.getParameters(); 

     parameters.setPreviewSize(width, height); 
     parameters.setPictureFormat(PixelFormat.JPEG); 
     parameters.setJpegThumbnailQuality(50); 
     parameters.setJpegThumbnailSize(192, 256); 

     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     camera.stopPreview(); 
     camera.release(); 
     camera=null; 
    } 
}; 

Camera.PictureCallback photoCallback=new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     new SavePhotoTask().execute(data); 
     camera.startPreview(); 
    } 
}; 

class SavePhotoTask extends AsyncTask<byte[], String, String> { 
    @Override 
    protected String doInBackground(byte[]... jpeg) { 
     filename = Utilities.getTimeString() + ".jpg"; 

     File photo=new File(filename); 
     if (photo.exists()) { 
      photo.delete(); 
     } 
     try { 
      FileOutputStream fos=new FileOutputStream(photo.getPath()); 
      fos.write(jpeg[0]); 
      fos.close(); 

     } 
     catch (java.io.IOException e) { 
      Log.d(TAG, "Exception in photoCallback", e); 
     } 
     return(null); 
    } 
} 

}

答えて

1

私はそれが愚かな音を知っているが、私は違ったあなたよりもやっている唯一のものではなく、ファイル名の文字列のFileオブジェクトでのFileOutputStreamを初期化しています。だから、あなたが持っているところ

FileOutputStream fos = openFileOutput(thumbnail.getPath(), MODE_WORLD_READABLE); 
FileOutputStream fos=new FileOutputStream(photo.getPath()); 

は、代わりにこれを試してみてください。

FileOutputStream fos = openFileOutput(thumbnail, MODE_WORLD_READABLE); 
FileOutputStream fos=new FileOutputStream(photo); 

が、私はそれを作るだろう、なぜ私は想像することはできませんが、これは、それは以前にはなかったところのものは、私のために働く作られたことを覚えているようです任意の違い。代わりに

FileOutputStream fos = openFileOutput(thumbnail.getPath(), MODE_WORLD_READABLE); 
FileOutputStream fos=new FileOutputStream(photo.getPath()); 

0

この

FileOutputStream fos = openFileOutput(thumbnail.getPath(), MODE_WORLD_READABLE); 
FileOutputStream fos=new FileOutputStream(new File(photo.getPath())); 
を試してみてください
関連する問題