![](/img/trans.png)
[英]Android pdf writer APW high resolution images cause out of memory expection
[英]android : rotate a high resolution picture generates an out of memory error
我尝试在“onPictureTaken”中旋转图片
public void onPictureTaken(byte[] data, Camera camera) {
String fileName = "last"+Calendar.getInstance().getTimeInMillis();
String finalFilePath=null;
File temp= Environment.getExternalStorageDirectory();
String destination=temp.getAbsolutePath()+"/pictureTest/";
Bitmap bitmap1 = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix mat = new Matrix();
mat.postRotate(90); // degree j'pense que t'as une methode qui te dit de combien tu veux faire t'as rotation.
Bitmap bBitmapRotate = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(), bitmap1.getHeight(), mat, true);
try {
FileOutputStream fos = null;
finalFilePath=destination +"/" + fileName + ".jpg";
fos = new FileOutputStream(finalFilePath);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bBitmapRotate.compress(CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
如果我使用2Mp图片它工作正常但如果我使用12Mp图片我得到内存不足错误。
05-22 11:08:41.180: D/dalvikvm(29694): GC_FOR_MALLOC freed 674K, 51% free 3015K/6087K, external 18826K/19988K, paused 33ms
05-22 11:08:41.190: I/dalvikvm-heap(29694): Grow heap (frag case) to 25.641MB for 2070498-byte allocation
05-22 11:08:41.230: D/dalvikvm(29694): GC_CONCURRENT freed 133K, 40% free 4903K/8135K, external 17940K/19988K, paused 1ms+2ms
05-22 11:08:41.700: D/dalvikvm(29694): GC_EXTERNAL_ALLOC freed 19K, 40% free 4884K/8135K, external 33575K/35623K, paused 24ms
05-22 11:08:41.710: E/dalvikvm-heap(29694): 24000000-byte external allocation too large for this process.
05-22 11:08:41.710: E/GraphicsJNI(29694): VM won't let us allocate 24000000 bytes
05-22 11:08:41.720: D/dalvikvm(29694): GC_FOR_MALLOC freed <1K, 40% free 4884K/8135K, external 33575K/35623K, paused 14ms
05-22 11:08:41.720: D/AndroidRuntime(29694): Shutting down VM
05-22 11:08:41.720: W/dalvikvm(29694): threadid=1: thread exiting with uncaught exception (group=0x2aac8578)
05-22 11:08:41.720: E/AndroidRuntime(29694): FATAL EXCEPTION: main
05-22 11:08:41.720: E/AndroidRuntime(29694): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.graphics.Bitmap.nativeCreate(Native Method)
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
05-22 11:08:41.720: E/AndroidRuntime(29694): at com.android.cocoatweet.TestTweetPictureActivity.onPictureTaken(TestTweetPictureActivity.java:143)
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:529)
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.os.Handler.dispatchMessage(Handler.java:99)
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.os.Looper.loop(Looper.java:138)
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.app.ActivityThread.main(ActivityThread.java:3701)
05-22 11:08:41.720: E/AndroidRuntime(29694): at java.lang.reflect.Method.invokeNative(Native Method)
05-22 11:08:41.720: E/AndroidRuntime(29694): at java.lang.reflect.Method.invoke(Method.java:507)
05-22 11:08:41.720: E/AndroidRuntime(29694): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
05-22 11:08:41.720: E/AndroidRuntime(29694): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
05-22 11:08:41.720: E/AndroidRuntime(29694): at dalvik.system.NativeStart.main(Native Method)
我试图从相机参数设置“setRotation()”,但它没有做任何事情。
public void onClick(View v) {
sendPicturedTweet();
}
});
}
protected void sendPicturedTweet() {
if(camera!=null){
camera.stopPreview();
Camera.Parameters camParams=this.camera.getParameters();
List<Size> sizes=camParams.getSupportedPictureSizes();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int prefSize=Integer.parseInt(preferences.getString(getString(R.string.picture_quality_key), "0"));
camParams.setPictureSize(sizes.get(prefSize).width, sizes.get(prefSize).height);
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camParams.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
camParams.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
camParams.setPictureFormat(ImageFormat.JPEG);
camParams.setJpegQuality(100);
camParams.setRotation(90);
camera.setParameters(camParams);
try{
this.camera.setPreviewDisplay(surfaceHolder);
this.camera.startPreview();
this.camera.takePicture(null, null, null, this);
}catch (Exception e) {
Log.e(LOG_TAG_VIDEO_PREVIEW, "ERROR IO on set preview display for camera.");
}
}
}
如何在不出现此错误的情况下旋转大图并尽可能获得最佳图像质量? 可能吗?
我正在使用Android 2.3.7开发Sony Xperia S.
谢谢。
当你到达这一行
Bitmap bBitmapRotate = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(), bitmap1.getHeight(), mat, true);
你已经在内存中有两次图像,如byte []数据和Bitmap bitmap1。 我认为你应该找到一种方法来清除byte []数据,然后再尝试转换图像(例如通过直接发送位图作为参数)
使用BitmapFactory.Option减小图像的大小
BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = 2;
你可以使用JNI(使用NDK)来克服android对应用程序施加的最大堆大小的限制。
在这种情况下,您可以做的是以下内容:
如果你愿意,我已经在这里创建了一个示例代码。
这个怎么样:
bitmap1 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(), bitmap1.getHeight(), mat, true);
你使用的内存有限,所以当你必须处理如此大的图片时,你必须考虑保存你的记忆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.