java - Android:缩放时管理位图内存不是一个选项

标签 java android image

我很清楚 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/

相关文章:

java - 应用程序在设备/模拟器中运行时崩溃

android - 如何在 Android Studio 中更改调试版本的设置

android - 在 Android 中显示大图像

Mac 中的 Java 1.6 没有 SwingWorker

java - 如何使用Jemmy获取java表格行/单元格/文本的颜色、字体?

java - Method.invoke() 与 RunTime.exec()

android - 动态更改 iOS 和 Android 上的应用程序图标

Android 资源转换为字符串 TypedValue 警告

html - 如何将一些图像重叠到一个 div 中?

PHP 或 Imagemagick : Number of Main Colors From an Image