安卓:使用BitmapFactory.decodeStream(...)和Assets文件夹时PNG透明度失效

9

我正在使用以下方法从我的Android应用程序中的assets文件夹中提取PNG文件:

public static Bitmap getBitmapFromAssets(Context context, String fileName) {
        try {
            AssetManager assetManager = context.getAssets();
            InputStream inputStream = assetManager.open(fileName);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        }
        catch(Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

我随后将一个 ImageView 的源设置为该位图,该 ImageView 是在 GridView 中的一项。

这是相关的布局 XML:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/containingLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center_horizontal"
    android:background="@android:color/transparent"
    android:padding="0dp"
    android:layout_margin="0dp"
>
    <ImageView
        android:id="@+id/ivPackageIcon"
        style="@style/smLargeGridItemPackageIconStyle"
    />
</LinearLayout>

而在该XML中所提到的样式是:

<style name="smLargeGridItemPackageIconStyle">
        <item name="android:scaleType">fitXY</item>
        <item name="android:layout_width">100dp</item>
        <item name="android:layout_height">142dp</item>
        <item name="android:layout_margin">5dp</item>
        <item name="android:background">@android:color/transparent</item>
    </style>

以下是设置ImageView源代码:

ImageView ivPackageIcon = (ImageView)containingView.findViewById(R.id.ivPackageIcon);
        if(ivPackageIcon != null) {
            Bitmap coverImage = getBitmapFromAssets(containingView.getContext(), "myimage.png");
            ivPackageIcon.setImageBitmap(coverImage);
        }

PNG图像有一些透明区域,但由于某种原因,当图像在我的GridView中显示时,透明区域会变成黑色。

预先回答一些问题:不,Activity、ImageView、GridView和GridView项的背景都不是黑色。事实上,无论背景颜色设置为什么,图像的透明部分总是呈现为黑色。

不过要考虑到这一点...如果我将PNG图像放置在drawable文件夹中,并按如下方式设置ImageView,则透明度就会完美:

ivPackageIcon.setImageResource(R.drawable.myimage);

我相信我以某种方式不正确地使用了decodeStream(...)方法,但我不知道我做错了什么。 我甚至修改了原始方法以设置一些选项,如下所示:

public static Bitmap getBitmapFromAssets(Context context, String fileName) {
        try {
            AssetManager assetManager = context.getAssets();
            InputStream inputStream = assetManager.open(fileName);

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inDither = true;
            options.inPreferredConfig = Config.ARGB_8888;

            Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
            return bitmap;
        }
        catch(Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

但是这给了我同样的糟糕结果。有什么想法吗?谢谢。

似乎您正在失去alpha通道。您能否在解码后将位图对象中的像素转储出来,并检查透明区域中是否具有正确的alpha值?请使用Bitmap.getPixels()函数。 - SirKnigget
2个回答

0

不要使用这个,尝试使用:

ImageView img=new ImageView(this);
        Drawable d = Drawable.createFromStream(getAssets().open(path_in_assets), null);
        img.setImageDrawable(d);

FYI,Android Studio在上述代码中会抛出错误消息。它建议将代码放在try/catch块中,以便处理任何IOExceptions。 - AJW

0

如果您的图像是由应用程序资源制成,并且放置在res/drawable/下而不是特定分辨率文件夹之一(例如res/drawable-hdpi)

Android编译器正在优化PNG,因此透明像素变为白色(对于GIFF文件则为黑色)

解决方法: 将PNG文件移动到res/drawable-hdpi或其他drawable文件夹之一,然后问题就会解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接