在Android中拍摄照片后保存缩略图
问题描述:
我有一个应用程序可以通过底部的完整代码拍摄照片。我的问题是关于如何访问存储在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);
}
}
}
答
我知道这听起来很愚蠢,但唯一我做不同于你正在初始化一个文件对象,而不是文件名的字符串的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());
试试这个
FileOutputStream fos = openFileOutput(thumbnail.getPath(), MODE_WORLD_READABLE);
FileOutputStream fos=new FileOutputStream(new File(photo.getPath()));