전체 코드를 통해 사진을 찍을 수있는 앱이 있습니다. 내 질문은 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);
}
}
}