图像不完全显示为白色,尽管它是正确的白色。

5

为了实现启动屏幕,我使用了一个包含白色背景(在Photoshop中进行了检查的纯白色)的图片。出于某种原因,它显示了略微带绿色的背景而不是活动的默认白色背景 - 如截图所示。只有在某些设备上才会出现这种情况,例如:

ImageView graphic shows now white background despite the image uses white

我将其作为单个视图添加到框架布局中的活动中:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<ImageView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scaleType="fitCenter"
    android:src="@drawable/splashscreen" />

</FrameLayout>

有什么想法吗?我了解RGB888与RGB565的问题,但是找不到合适的解决方案。

注:我可以将图像中的白色更改为透明,但更希望理解问题并找到合适的解决方案。

6个回答

9

这真的很烦人。我想知道为什么只有很少的人遇到这个问题,因为它应该在所有32位显示器上出现。

你提到了RGB888格式是正确的。问题的原因是,尽管APK文件中的原始位图格式不同,��所有位图都被压缩了(在我的情况下压缩成索引256色!真是见鬼了?)。

我找不到阻止它的方法,所以如果有人知道正确的解决方案,请告诉我。

然而,我找到了两种解决白色问题的方法。

1)针对每个位图:假设我们有一个名为@drawable/mypng的可绘制位图资源,它导致了这个问题。我们需要添加一个额外的XML可绘制位图drawable/mypng_nofilter.xml

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/mypng"
    android:filter="false"
/>

1) 对于单个图片:

如果您想加载一个没有经过滤镜处理的图片,请使用@drawable/mypng_nofilter

2) 对于整个活动:

在活动的onCreate方法中需要添加以下内容:

getWindow().setFormat(PixelFormat.RGB_565);

现在窗口的色深为16位,所有位图看起来都是“正确”的白色。

我仍然希望有32位的色深,但我不知道如何控制编译时的图像压缩。


2

我通过将Bitmap.CompressFormat类型更改为PNG而不是JPEG来解决了这个问题:

Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.nouv);
Bitmap bitmap = (Bitmap)((BitmapDrawable) drawable).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);

0

在Stackoverflow上使用了所有的解决方案。从更改 android:srcapp:srcCompact 等许多其他解决方案。 帮助我的是我的图像在 drawable-anydpi 文件夹中,我将图像从 drawable-anydpi 移动到了 drawable 文件夹中,并在经过2小时的研究后解决了问题。

P.S:这可能也会对某些人有所帮助,所以我把它放在这里。


0

我在处理网络加载的图片时遇到了同样的问题。我通过禁用位图过滤器来解决了这个问题。由于我在ICS及更高版本的设备上没有这个问题,所以我只关闭了早期版本的位图过滤器。以下是我使用的代码(将网络加载的位图设置为ImageView)。

BitmapDrawable bitmapDrawable = new BitmapDrawable(imageView.getContext().getResources(), bitmap);
bitmapDrawable.setFilterBitmap(false);
imageView.setImageDrawable(bitmapDrawable);

-1

由于您的图像仅在中间有一张图片,我建议您设置如下:

android:scaleType="centerCrop"

它将在左右两侧裁剪您图片的一部分,但会利用整个屏幕...

-1

你也可以使用图片的颜色(似乎是F8FCF8)来定义FrameLayout或ImageView的背景:

android:background="#F8FCF8"


如上所述,所使用的图像具有纯粹的#FFFFFF背景。当Android添加图像时,绿色背景会生成 - 然后在屏幕截图上可见。 - Bachi
嗯...这很奇怪。我从未见过这种情况。那么也许尝试第一个解决方案? - Jeje Doudou
不是选项,无法裁剪,因为它填充了下部(上面的示例是为演示而裁剪的)。 - Bachi

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