1

ビットマップのメモリ使用量を最小限に抑えながら、ビットマップの品質を最大限に高めるために、簡単な質問をしたいと思います:

.pngAPI を使用して、特定の画像ファイル (ファイル) に透過性があるかどうかを、その中のすべてのピクセルをチェックせずにチェックする方法はありますか?

イメージに透明度がない場合は、RGB 値のみを使用する別のビットマップ形式を使用するのが最適です。

問題は、Android にも 3 色だけのフォーマットがないことです。画像の品質を低下させ、ディザリング機能を有効にする必要があると言われている RGB_565 のみ。

RGB 値のみを読み取り、それらを表示できる方法もありますか?

4

4 に答える 4

2

私にとってbitmap.hasAlpha()は、ビットマップにアルファ値があるかどうかを最初に確認するのに問題ありません。その後、ピクセルを実行し、アルファなしで 2 番目のビットマップを作成する必要があります。

于 2014-02-02T12:00:13.790 に答える
1

少しオフトピックから始めましょう

問題は、Androidにも3色だけのフォーマットがないことです。RGB_565のみ。これは、画像の品質を低下させ、ディザリング機能を有効にする必要があると彼らは言っています。

その問題の理由は、実際にはAndroid固有ではありません。それは、画像を描画する際のパフォーマンスに関するものです。pixeldataが132ビットメモリセルに正確に収まる場合、最高のパフォーマンスが得られます。

したがって、最も明白な優れたピクセル形式は、ARGB_8888正確に32ビット(アルファの場合はカラー8の場合は24)を使用するフォーマットです。描画中は、画像データをループする以外に何もする必要はなく、読み取った各セルを直接描画できます。唯一の欠点は、そのような画像を処理するために必要なメモリです。画像がメモリ内にある場合と、グラフィックハードウェアがより多くのデータを転送する必要があるため、画像を表示している場合の両方です。

2番目に良いオプションは、複数のピクセルが1つのセルに収まるフォーマットを使用することです。32ビットで2ピクセルを使用すると、残りのピクセルあたり16ビットがあり、16ビットを使用する形式の1つは565形式です。5ビットの赤、6ビットの緑、5ビットの青。これを描画している間も、メモリーセルを個別に操作できます。必要なのは、1つのセルを部分的に分割することだけです。画像に必要なメモリサイズが小さいため、32ビットカラーを使用するよりも描画がさらに高速になる場合があります。アンドロイドメモリの初めにはるかに大きな問題だったので、彼らはこのフォーマットをデフォルトとして選択しました。

そして、フォーマットの最悪のカテゴリーは、ピクセルがそれらのセルに収まらないものです。3色だけを使用すると、24ビットになり、4つのケースのうち3つで2つのセルに分散する必要があります。たとえば、2番目のピクセルは、最初のセルの残りの8ビットと次のセルの最初の16ビットを使用します。24ビットカラーでの作業に必要な余分な作業は非常に大きいため、使用されません。また、画像を描画するときは、通常、ある時点でアルファがあります。そうでない場合は、単に32ビットを使用しますが、アルファビットは無視します。

したがって、16ビットアプローチは見苦しく、24ビットアプローチは意味がありません。また、Androidのメモリ制限は以前ほど厳しくなく、ハードウェアが高速化されたため、Androidはデフォルトを32ビットに切り替えました(詳細については、http://www.curious-creature.org/2010/12/を参照してください)。 08 / bitmap-quality-banding-and-dithering /


あなたの本当の質問に戻る

APIを使用して、特定の画像ファイル(pngファイル)に透明度があるかどうかを、その中のすべてのピクセルをチェックせずにチェックする方法はありますか?

知らない。ただし、JPEG画像はアルファをサポートしておらず、PNG画像は通常アルファを備えています。ほとんどの場合、ファイル拡張子を悪用して正しく取得することができます。

ただし、これらすべてに煩わされることなく、ビットマップの効率的な表示ARGB_8888に関するAndroidトレーニングドキュメントで詳しく説明されている優れた画像読み込みテクニックを使用して適用することをお勧めします。

人々がメモリの問題に遭遇する理由は、通常、現在表示されているよりもはるかに多くの画像がメモリにロードされているか、電話の小さな画面に表示できない巨大な画像を使用しているためです。そして私の意見では、画質を下げるためにコードを複雑にするよりも、優れたメモリ管理を追加する方が理にかなっています。

于 2012-08-22T21:32:44.337 に答える
1

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;
}

それ以外に、そのようなことが可能かどうかはわかりません。

于 2015-07-09T08:11:03.733 に答える
0

PNGファイルに透過性があるかどうかを確認するのに役立つ次のリンクを見つけました。残念ながら、これは png ファイルのみのソリューションです。残りのファイル ( webP 、 bmp など) には、別のパーサーが必要です。

リンク:

http://www.java2s.com/Code/Java/2D-Graphics-GUI/PNGDecoder.htm

http://hg.l33tlabs.org/twl/file/tip/src/de/matthiasmann/twl/utils/PNGDecoder.java

http://www.java-gaming.org/index.php/topic,24202

于 2012-08-24T10:36:30.130 に答える