我很清楚 OutOfMemoryError hell ,使用位图可以让大量图像的应用程序进入。通常,我总是通过自适应缩放图像、使用缓存等来解决这个问题。
但是,目前我正在开发一个应用程序,其中一个用例是能够拍摄图像并自动为另一张较小的图像添加水印(即合并)。规范明确指出品牌图像必须与原始图像具有相同的尺寸和质量,因此我无法缩放。
我已经发现这不可能实现:尝试创建与原始图像具有相同尺寸的位图总是会在我用于测试的 Galaxy S3 上抛出 OOME,即使 android:largeHeap="true" 已设置。
有没有可能解决这个问题?
相关代码为:
private Bitmap mergeImages(Bitmap firstImage, Bitmap secondImage) {
Bitmap.Config config = (firstImage.getConfig() != null) ? firstImage.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap resultImage = Bitmap.createBitmap(
Math.max(firstImage.getWidth(), secondImage.getWidth()),
Math.max(firstImage.getHeight(), secondImage.getHeight()),
config);
Canvas mergeCanvas = new Canvas(resultImage);
Paint paint = new Paint();
mergeCanvas.drawBitmap(firstImage, 0, 0, paint);
mergeCanvas.drawBitmap(secondImage, 0, 0, paint);
return resultImage;
}
最佳答案
我们在我的应用程序中用两个位图做了一个类似的合并效果,我们这样做的方法是为它们都使用一个 RelativeLayout 容器,这样它们就出现在同一个地方,一个叠加在另一个上:
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
>
<ImageView
android:id="@+id/discovery_row_photo"
android:layout_width="130dp"
android:layout_height="130dp" />
<ImageView
android:id="@+id/discovery_row_photo_corner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/discovery_row_photo"
android:layout_alignTop="@id/discovery_row_photo"
android:contentDescription="@null"
android:src="@drawable/discovery_corner_badge" />
</RelativeLayout>
第二个 ImageView 是我认为您想要的“水印”。通过这种方式,我们缩放原始图像 discovery_row_photo
,并将 discovery_row_photo_corner
放置在它上面。由于第二个大部分是透明的,因此效果很好。不确定这是否适用于您的用例,但这是一个有用的技巧。
关于java - Android:缩放时管理位图内存不是一个选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23351068/