Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检查是否存在透明度&;仅加载RGB值_Android_Bitmap_Rgb_Alpha Transparency - Fatal编程技术网

Android 检查是否存在透明度&;仅加载RGB值

Android 检查是否存在透明度&;仅加载RGB值,android,bitmap,rgb,alpha-transparency,Android,Bitmap,Rgb,Alpha Transparency,为了尽量减少位图的内存使用,同时尽量提高位图的质量,我想问一个简单的问题: 是否有一种方法可以让我使用API检查给定的图像文件(.png文件)是否具有透明度,而不检查其中的每个像素 如果图像没有任何透明度,最好使用仅使用RGB值的其他位图格式 问题是Android也没有一个仅适用于3种颜色的格式。只有RGB_565,他们说这会降低图像质量,应该启用抖动功能 是否还有一种方法可以只读取RGB值并能够显示它们?让我们从话题开始 问题是android也没有一个仅适用于3种颜色的格式。只有RGB_565

为了尽量减少位图的内存使用,同时尽量提高位图的质量,我想问一个简单的问题:

是否有一种方法可以让我使用API检查给定的图像文件(
.png
文件)是否具有透明度,而不检查其中的每个像素

如果图像没有任何透明度,最好使用仅使用RGB值的其他位图格式

问题是Android也没有一个仅适用于3种颜色的格式。只有RGB_565,他们说这会降低图像质量,应该启用抖动功能


是否还有一种方法可以只读取RGB值并能够显示它们?

让我们从话题开始

问题是android也没有一个仅适用于3种颜色的格式。只有RGB_565,他们说这会降低图像质量,应该启用抖动功能

这个问题的原因并不是Android特有的。这是关于在绘制图像时的性能。如果pixeldata正好适合132位存储单元,则可以获得最佳性能

因此,最明显的好像素格式是
ARGB_8888
格式,它精确地使用了32位(24表示alpha的颜色8)。在绘图时,您无需执行任何操作,只需循环图像数据,即可直接绘制读取的每个单元格。唯一的缺点是处理这些图像所需的内存,无论是当它们只是在内存中,还是在显示它们时,因为图形硬件必须传输更多的数据

第二个最佳选择是使用一种格式,其中多个像素适合一个单元格。使用32位中的2个像素,每像素剩下16位,使用16位的格式之一是565格式。5比特红,6比特绿,5比特蓝。在绘制此图时,您仍然可以单独处理内存单元,您所要做的就是将一个单元拆分为多个部分。由于图像所需的内存较小,绘制有时甚至比使用32位颜色更快。因为在android的初期,内存是一个更大的问题,所以他们选择这种格式作为默认格式

最糟糕的格式类别是那些像素不适合这些单元格的格式。如果你只取3种颜色,你会得到24位,这些颜色需要分布在4种情况中的3种中的2个单元格上。例如,第二个像素将使用第一个单元格的剩余8位&下一个单元格的前16位。使用24位颜色所需的额外工作量太大,无法使用。在绘制图像时,通常在某个点上有alpha,如果没有,只需使用32位,而忽略alpha位

因此,16位方法看起来很难看&24位方法没有意义。由于Android的内存限制没有以前那么严格,硬件也变得更快了,Android已经将其默认值改为32位(在中有更详细的解释)


回到你真正的问题上来

有没有一种方法可以让我使用API检查给定的图像文件(png文件)是否具有透明度,而不检查其中的每个像素

我不知道。但是JPEG图像不支持alpha,PNG图像通常有alpha。在大多数情况下,您可以简单地滥用文件扩展名以使其正确

但我建议您不要为这些烦恼,只需使用
ARGB_8888
并应用Android培训文档中详细介绍的优秀图像加载技术


人们遇到内存问题的原因通常是,他们在内存中加载的图像比当前显示的图像多得多,或者他们使用无法在手机小屏幕上显示的巨大图像。在我看来,添加良好的内存管理比使代码复杂化以降低图像质量更有意义。

我找到了下面的链接,这些链接有助于检查png文件是否具有透明度。不幸的是,它只是一个解决方案,仅适用于png文件。其余文件(如webP、bmp等)需要使用不同的解析器

链接:


对于我
位图。hasAlpha()
可以首先检查位图是否有alpha值。之后,你必须运行通过像素和创建第二个位图没有阿尔法我会建议

有一种方法可以检查PNG文件是否具有透明度,或者至少它是否支持透明度:

public final static int COLOR_GREY = 0;
public final static int COLOR_TRUE = 2;
public final static int COLOR_INDEX = 3;
public final static int COLOR_GREY_ALPHA = 4;
public final static int COLOR_TRUE_ALPHA = 6;
private final static int DECODE_BUFFER_SIZE = 16 * 1024;
private final static int HEADER_DECODE_BUFFER_SIZE = 1024;

/** given an inputStream of a png file , returns true iff found that it has transparency (in its header) */
private static boolean isPngInputStreamContainTransparency(final InputStream pngInputStream) {
    try {
        // skip: png signature,header chunk declaration,width,height,bitDepth :
        pngInputStream.skip(12 + 4 + 4 + 4 + 1);
        final byte colorType = (byte) pngInputStream.read();
        switch (colorType) {
        case COLOR_GREY_ALPHA:
        case COLOR_TRUE_ALPHA:
            return true;
        case COLOR_INDEX:
        case COLOR_GREY:
        case COLOR_TRUE:
            return false;
        }
        return true;
    } catch (final Exception e) {
    }
    return false;
}

除此之外,我不知道这样的事情是否可能发生。

选择标签时请小心,这是您今天第二次通过打字错误意外创建标签。:)打字错误是什么?之前的打字错误是什么?你两次都用“androd”代替“android”。我明白了。大约3个字节对4个字节,3个字节不是比4个字节快,但质量相同吗?缓存会更好,因为每个页面都有更多有用的数据,不是吗?此外,在PNG中,是否可以通过读取文件头来检查透明度,而不检查像素,例如?3字节和4字节具有相同的质量,但图形硬件会将3字节转换回4字节(或2字节),因为内部计算机无法处理奇数。因此,是的,如果您需要更少的缓存,那么缓存本身会变得更好,但总体而言,由于所需的转换,您会降低效率Android API无法确定文件是否使用alpha保存,只有在解码的
Bitmap
s具有alpha时。您可以编写一个文件头解析器,或者检查是否有任何库可以为您这样做。我明白了。是否有一个开源库可以做到这一点?在成功从文件加载整个位图后,您的解决方案就会起作用,这意味着您需要对其全部进行解码。这需要更多的时间,可能会占用大量内存。在这一步之后,你需要释放这个位图并将文件再次解码成位图…我对这个评论投了赞成票,因为它对我们的scen有效