我有一个列表视图,每行有几个图像按钮.单击列表行时,将启动新活动.由于相机布局有问题,我不得不建立自己的标签.为结果启动的活动是地图.如果我单击我的按钮启动图像预览(从SD卡加载图像),应用程序将从活动返回到活动返回到listview结果处理程序以重新启动我的新活动,这只是一个图像小部件.
列表视图上的图像预览正在使用光标和ListAdapter.这使得它非常简单,但我不确定如何放置一个经过调整大小的图像(即小的像素大小不像动态src图像按钮那样.所以我只是调整了从手机摄像头下来的图像.
问题是当我试图返回并重新启动第二个活动时,我收到内存不足错误.
这是更好的,因为我还需要对每行中的小部件/元素的属性进行一些更改,因为焦点问题我无法选择带触摸屏的行.(我可以用滚球.)
一旦我在列表视图上禁用了图像,它再次正常工作.
仅供参考:这就是我的做法:
String[] from = new String[] { DBHelper.KEY_BUSINESSNAME,DBHelper.KEY_ADDRESS,DBHelper.KEY_CITY,DBHelper.KEY_GPSLONG,DBHelper.KEY_GPSLAT,DBHelper.KEY_IMAGEFILENAME + ""};
int[] to = new int[] {R.id.businessname,R.id.address,R.id.city,R.id.gpslong,R.id.gpslat,R.id.imagefilename };
notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
Run Code Online (Sandbox Code Playgroud)
哪里R.id.imagefilename是ButtonImage.
这是我的LogCat:
01-25 05:05:49.877: ERROR/dalvikvm-heap(3896): 6291456-byte external allocation too large for this process.
01-25 05:05:49.877: ERROR/(3896): VM wont let us allocate 6291456 bytes
01-25 05:05:49.877: ERROR/AndroidRuntime(3896): Uncaught handler: thread main exiting due to …Run Code Online (Sandbox Code Playgroud) 我有正方形或矩形的位图.我采取最短的一面,做这样的事情:
int value = 0;
if (bitmap.getHeight() <= bitmap.getWidth()) {
value = bitmap.getHeight();
} else {
value = bitmap.getWidth();
}
Bitmap finalBitmap = null;
finalBitmap = Bitmap.createBitmap(bitmap, 0, 0, value, value);
Run Code Online (Sandbox Code Playgroud)
然后我使用它将它缩放到144 x 144位图:
Bitmap lastBitmap = null;
lastBitmap = Bitmap.createScaledBitmap(finalBitmap, 144, 144, true);
Run Code Online (Sandbox Code Playgroud)
问题是它裁剪原始位图的左上角,任何人都有代码来裁剪位图的中心?
尽管我在drawable文件夹中有一个非常小的图像,我从用户那里得到了这个错误.我没有在代码中使用任何位图功能.至少故意:)
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:683)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:513)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:889)
at android.content.res.Resources.loadDrawable(Resources.java:3436)
at android.content.res.Resources.getDrawable(Resources.java:1909)
at android.view.View.setBackgroundResource(View.java:16251)
at com.autkusoytas.bilbakalim.SoruEkrani.cevapSecimi(SoruEkrani.java:666)
at com.autkusoytas.bilbakalim.SoruEkrani$9$1.run(SoruEkrani.java:862)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
根据这个stackTrace,我在这一行得到了这个错误('tv'是一个textView):
tv.setBackgroundResource(R.drawable.yanlis);
Run Code Online (Sandbox Code Playgroud)
问题是什么?如果您需要有关代码的其他信息,我可以添加它.谢谢!
我想用BitmapFactory.decodeFile(路径,选项)解码SD卡中的图像.
我还希望将大于2048x2048像素的图像缩小到最多2048x2048(保持比例).
我可以在获取位图后手动执行此操作,但除了已分配的字节之外,还需要分配大量字节.
我应该如何设置我的BitmapFactory.Options对象以获得该效果?
谢谢
我想将一个位图图像的裁剪版本加载到Bitmap对象中,而不加载原始位图.
如果不编写自定义加载例程来处理原始数据,这是否可行?
谢谢,桑德尔
我需要以图库形式全屏显示原始图像.对于拇指,它将完美地工作,当我尝试使用原始源以全屏显示该图像时,它将无法显示.在大多数情况下,如果图像分辨率大于2000,那么它将显示错误位图太大而无法上传到纹理android.
我想阻止这一点,我搜索谷歌但没有得到任何答案.
如果你有一个Uri并且你需要它Bitmap,理论上你可以做到这一点
Bitmap troublinglyLargeBmp =
MediaStore.Images.Media.getBitmap(
State.mainActivity.getContentResolver(), theUri );
Run Code Online (Sandbox Code Playgroud)
但它每次都会崩溃,
所以你这样做.........
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
AssetFileDescriptor fileDescriptor =null;
fileDescriptor =
State.mainActivity.getContentResolver().openAssetFileDescriptor( theUri, "r");
Bitmap actuallyUsableBitmap
= BitmapFactory.decodeFileDescriptor(
fileDescriptor.getFileDescriptor(), null, options);
Utils.Log("'4-sample' method bitmap ... "
+actuallyUsableBitmap.getWidth() +" "
+actuallyUsableBitmap.getHeight() );
Run Code Online (Sandbox Code Playgroud)
这太棒了,是工作的解决方案.
请注意,在当前条件下(2014年),典型的相机尺寸等,"四"因子往往效果很好.但是,最好在Uri上猜测或准确了解图像数据的大小,然后使用它信息,智能地选择那个因素.
简而言之,如何在加载Uri时正确选择该比例因子?
Android专家,这是一个众所周知的问题,有没有解决方案?感谢您的iOS-> Android好友!:)
如何从相机获取具有特定(内存友好)大小的位图?
我正在开始一个相机意图:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra("return-data", true);
photoUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "mytmpimg.jpg"));
cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA);
Run Code Online (Sandbox Code Playgroud)
我在这里处理结果:
// Bitmap photo = (Bitmap) intent.getExtras().get("data");
Bitmap photo = getBitmap(photoUri);
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用注释行 - 直接获取位图,我总是得到一个160 x 120位图,而且这个位图太小了.如果我使用我发现的一些标准内容(方法getBitmap)从URI加载它,它会加载一个2560 x 1920位图(!)并消耗近20 MB的内存.
如何加载让我们说480 x 800(相机预览显示的尺寸相同)?
无需将2560 x 1920加载到内存中并缩小.
所以我得到了用户从SD卡中选择的图像的Uri图像.而且我想显示该图像的缩略图,因为很明显,图像可能很大并占据整个屏幕.谁知道怎么样?
我有一个非常图片密集的Android应用程序.我目前正在使用Bitmap.createScaledBitmap()将图像缩放到所需的大小.但是,这种方法要求我已经在内存中有原始位图,这可能非常大.
如何在不首先将整个内容写入本地内存或文件系统的情况下缩放我正在下载的位图?