Bitmap.Config属性の詳細と異なるフォーマットの画像の違いの紹介


ブロガー宣言:
転載は冒頭に本文のリンクと作者の情報を添付し、転載と表記してください.本文はブロガーの威威猫がオリジナルで、多く支持して指導してください.
本文はこのブロガーに先発した:威威にゃ|ブログホームページ:https://blog.csdn.net/smile_running
Android UIの中で最も離れられないのは画像で、画像はpng、jpeg、webpフォーマットなど多くのフォーマットで構成することができます.同じ画像には異なる大きさがあり、画像の幅や高さが一致している場合でも違いがあることがあります.これが画像内部の格納構造によるもので、今日はBitmapを通じています.Configの下の属性タイプは、ビットマップがどのように格納されているか、正確には内部がどのような規格で格納されているかを学習させます.そして、なぜこのような違いがあるのかがわかります.
ビットマップを作成する最も一般的な操作は次のとおりですが、一般的にはConfig付きのタイプは設定されません.
//    Bitmap ,         Config
Bitmap.createBitmap(...,Config);
  • 画像フォーマット紹介
  • まず、Bitmapのいくつかのパラメータタイプのソースコードを見てみましょう.
    ここのソースコードは圧縮タイプを設定し、3つの選択肢があり、コンピュータの画像フォーマットで最も一般的なものでもあります.
        //         
        public static enum CompressFormat {
            JPEG,
            PNG,
            WEBP;
    
            private CompressFormat() {
            }
        }
  • PNG形式
  • 全称:ポータブルネットワークグラフィックス(Portable Network Graphics,PNG)は、インデックス、階調、RGBの3色スキーム、Alphaチャネルなどの特性をサポートする無損圧縮ビットマップグラフィックスフォーマットです.最大1600万色をサポートし、全透明/半透明をサポートし、複雑な画像の透明性も含まれています.その最大の特徴は、無損圧縮であるべきであり、圧縮の場合でも画像品質を低下させないように、豊富な色表示効果を有する.
  • JPEG形式
  • 全称:(Joint Photographic Experts Group,JPEG)画像専門家グループの英語の略語を組み合わせて、これは私たちが気にしないでください.コンピュータでよく見られるのはJPGの接尾辞ファイルは、実はその略語形式です.これは、昔からコンピュータには、接尾辞名のフォーマットを3ビットで保存するという規定があったからです.JPEGは圧縮規格であり、標準JPEG、プログレッシブJPEG、JPEG 2000の3種類に分けられるが、この3つには大きな違いがある.
  • 標準JPEG:最高レベルの圧縮をサポートしますが、圧縮には損失があります.このタイプの画像は、Webページのダウンロード時に上から下へ順番に画像を表示するしかなく、画像資料がすべてダウンロードされるまで、全体が表示されます.
  • プログレッシブJPEG:標準JPEGの改良フォーマットは、Webページのダウンロード時に、まず画像の粗い外観を提示した後、徐々に完全な内容を提示することができ、プログレッシブJPGのファイルは標準JPGのファイルよりも小さい.
  • JPEG 2000:次世代の映像圧縮法で、圧縮品質がより良く、その圧縮率は標準JPEGより約30%程度高く、同時に損失と無損圧縮をサポートする.1つの極めて重要な特徴は、画像の輪郭を先に伝送し、その後、データを徐々に伝送し、画像をぼんやりからはっきり表示するようにする漸進的な伝送を実現できることである.
  • WEBフォーマット
  • WebPフォーマットは、Googleが2010年に発売した次世代の画像フォーマットであり、Googleが開発した画像のロード速度を速めるための画像フォーマットでもある.画像圧縮容量はJPEGの約2/3で、サーバのブロードバンドリソースとデータスペースを大幅に節約できます.WebPは、損失圧縮と無損失圧縮の両方をサポートします.JPEGファイルを符号化するよりも、同じ品質のWebPファイルを符号化するには、より多くの計算リソースが必要です.
    Googleブラウザはすでにwebpフォーマットをサポートしており、Operaはバージョン番号Opera 11にある.10後もサポートが追加されたが、火狐とieはまだwebpフォーマットをサポートしていない.もちろん、Androidシステムもサポートされており、IOSはまだサポートされていません.
    ビットマップパラメータ紹介Androidの3つのビットマップ格納フォーマットについて説明しましたが、ソースコードでビットマップの構成プロパティを解読します.もちろん、英語が上手なあなたはこれらの注釈を見て直感的にそれらのいくつかの違いと役割を知ることができますが、私は簡単に紹介して例を挙げて説明します.
    これは私たちのBitmapです.Configのプロパティは、enum(列挙)タイプで構成され、6の列挙を選択できます.その中で最もよく使われる4つを選んで重点的に説明します.次はBitmapです.Configのソース:
        /**
         * Possible bitmap configurations. A bitmap configuration describes
         * how pixels are stored. This affects the quality (color depth) as
         * well as the ability to display transparent/translucent colors.
         */
        public enum Config {
            // these native values must match up with the enum in SkBitmap.h
    
            /**
             * Each pixel is stored as a single translucency (alpha) channel.
             * This is very useful to efficiently store masks for instance.
             * No color information is stored.
             * With this configuration, each pixel requires 1 byte of memory.
             */
            ALPHA_8     (1),
    
            /**
             * Each pixel is stored on 2 bytes and only the RGB channels are
             * encoded: red is stored with 5 bits of precision (32 possible
             * values), green is stored with 6 bits of precision (64 possible
             * values) and blue is stored with 5 bits of precision.
             *
             * This configuration can produce slight visual artifacts depending
             * on the configuration of the source. For instance, without
             * dithering, the result might show a greenish tint. To get better
             * results dithering should be applied.
             *
             * This configuration may be useful when using opaque bitmaps
             * that do not require high color fidelity.
             */
            RGB_565     (3),
    
            /**
             * Each pixel is stored on 2 bytes. The three RGB color channels
             * and the alpha channel (translucency) are stored with a 4 bits
             * precision (16 possible values.)
             *
             * This configuration is mostly useful if the application needs
             * to store translucency information but also needs to save
             * memory.
             *
             * It is recommended to use {@link #ARGB_8888} instead of this
             * configuration.
             *
             * Note: as of {@link android.os.Build.VERSION_CODES#KITKAT},
             * any bitmap created with this configuration will be created
             * using {@link #ARGB_8888} instead.
             *
             * @deprecated Because of the poor quality of this configuration,
             *             it is advised to use {@link #ARGB_8888} instead.
             */
            @Deprecated
            ARGB_4444   (4),
    
            /**
             * Each pixel is stored on 4 bytes. Each channel (RGB and alpha
             * for translucency) is stored with 8 bits of precision (256
             * possible values.)
             *
             * This configuration is very flexible and offers the best
             * quality. It should be used whenever possible.
             */
            ARGB_8888   (5),
    
            /**
             * Each pixels is stored on 8 bytes. Each channel (RGB and alpha
             * for translucency) is stored as a
             * {@link android.util.Half half-precision floating point value}.
             *
             * This configuration is particularly suited for wide-gamut and
             * HDR content.
             */
            RGBA_F16    (6),
    
            /**
             * Special configuration, when bitmap is stored only in graphic memory.
             * Bitmaps in this configuration are always immutable.
             *
             * It is optimal for cases, when the only operation with the bitmap is to draw it on a
             * screen.
             */
            HARDWARE    (7);
    
            final int nativeInt;
    
            private static Config sConfigs[] = {
                null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888, RGBA_F16, HARDWARE
            };
    
            Config(int ni) {
                this.nativeInt = ni;
            }
    
            static Config nativeToConfig(int ni) {
                return sConfigs[ni];
            }
        }
    public enum Config {
    
            ALPHA_8     (1),
        
            RGB_565     (3),
     
            RGBA_F16    (6),
    
            ARGB_8888   (5),
        }

    以上の4種類は私たちが最もよく使う属性設定で、ARGB_4444頭に捨てられた注釈があるので、その属性を具体的に説明しません.ARGBを知っていれば8888ではARGB_4444は同じ理屈です.
    まず、最初のALPHAを見てみましょう.8,この列挙タイプはswith文のcase条件として機能するので,列挙も特に便利である.利点は、スレッドが安全な単利モードであり、シーケンス化もサポートされていることです.欠点は、大量に使用するとパフォーマンスが低下することです.
  • ALPHA_8

  • 上のソースコードの注釈に基づいて、私は簡単にその属性情報を要約します.まず、各画素には透明度値が格納され、各画素は1バイト(8ビット)を占める、すなわち後の8の由来である.次に,色情報を一切格納せず,単純に透明度の処理を行う.
    変数名に基づいて、表現する情報を初歩的に知ることができます.以下もそうです.
  • RGB_565

  •     RGB_565は、変数名に記載されているように.RはRed、GはGreen、BはBlueを表します.565は、各画素が2バイトを占有するように格納される方法である.赤が5位、緑が6位、青が5位(5位保存の値2の5次方である32種の可能性、例えば0000100002....同6位には64種の値がある).このように多くの色の値を提供することができますが、透明ではありません.透明度を保存するチャネルが提供されていないため、通常は不透明なピクチャの設定に使用されます.
  • ARGB_8888

  • 私はすでに2つの例を説明して、これを信じてあなた自身も理解することができます.名前の通り、色と透明度のチャネルを提供し、以上の2つの方法を統合しています.各ピクセルは4バイト(画像のサイズも明らかに増加)を占め、各ピクセルは8ビットで色と透明度の値を保存します.8ビットには256種類の可能な値があることを知っています.これは、その色値の可能性が多ければ多いほど、画像の品質、表示効果が大幅に向上することを意味します.したがって、これも推奨されるプロパティ設定です.
  • RGBA_F16

  • これは上の変数名とはまた少し違いますが、F 16からわかります.各画素は8バイトを占有しているが、半浮動小数点数で記憶されており、前のFは通じている.Googleのコメントでは、この属性が広色域のワイドスクリーンやHDR(高ダイナミックレンジの画像)に非常に適していることも示しています.そのため、メモリの消費量が最も高いため、表示の効果も非常に優れています.
    例を挙げます.
    例えばARGB_8888にとって、その持つ色の種類は赤:2^8、緑:2^8、青:2^8、つまり約1600万種類以上の色です.このような多くの色からなる1枚の画像、例えば1920*1080画素の1枚の図、ARGB_8888方式で色値を格納すると.その大きさは1920*1080*4(バイト)=8294400(bytes)=7.91メガ(M)の約値です.
    もちろん、RGBAを使えばF 16の方式は色の値を保存して、あれは16 Mぐらいの1枚の図で、これは携帯電話にとってすでに1枚の非常にハイビジョンのピクチャーです.