2011-01-19 6 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

나는 바보 같은 소리로 들리 겠지만 당신이 파일 객체 대신 파일 이름 문자열로 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())); 
시도
관련 문제