「BufferedImage」の TYPE_4BYTE_ABGR から TYPE_INT_ARGB にする方法

投稿日: 更新日:

Java の BufferedImage は getType() を使うことでタイプを知ることが出来ます。
byte型でABGRの順に記録されている場合は、BufferedImage.TYPE_4BYTE_ABGR
int型でARGBが記録されている場合は、BufferedImage.TYPE_INT_ARGB になります。

TYPE_4BYTE_ABGR の画像を、
ColorConvertOp(中ではg.drawImage(image, 0, 0, null);) を利用して変換すると、なぜか色が変わる場合があります。※
PixelGrabber を利用すれば、色は変わらないです。

ですが、直接変換する方法のサンプルを紹介します。
BufferedImage から int型のデータを取得するサンプルにもなると思います。

BufferedImage.TYPE_4BYTE_ABGR の image から
BufferedImage.TYPE_INT_ARGB の newimage へ

int width  = image.getWidth();
    int height = image.getHeight();
    int pixelsize = width * height;
    BufferedImage newimage = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
    int[] pixels = ((DataBufferInt)(newimage.getRaster().getDataBuffer())).getData();
    byte[] binary = ((DataBufferByte)(image.getRaster().getDataBuffer())).getData();
    int r,g,b,a;
    for(int i=0,j=0;i<pixelsize;i++) {
        a = binary[j++]&0xff;
        b = binary[j++]&0xff;
        g = binary[j++]&0xff;
        r = binary[j++]&0xff;
    pixels[i] = (a<<24)|(r<<16)|(g<<8)|b;
    }

以上です。

BufferedImage.TYPE_3BYTE_BGR の場合は

    b = binary[j++]&0xff;
    g = binary[j++]&0xff;
    r = binary[j++]&0xff;
    pixels[i] =0xff000000|(r<<16)|(g<<8)|b;

BufferedImage.TYPE_CUSTOM で取得した DataBuffer のタイプが TYPE_BYTE の場合も
上記のような感じで変換できるようです。
但し、順番が下記のようになるっぽいです。

BufferedImage.TYPE_CUSTOM かつ getColorModel().hasAlpha() で true の場合は

    r = binary[j++]&0xff;
    g = binary[j++]&0xff;
    b = binary[j++]&0xff;
    a = binary[j++]&0xff;
    pixels[i] = (a<<24)|(r<<16)|(g<<8)|b;

BufferedImage.TYPE_CUSTOM かつ getColorModel().hasAlpha() で false の場合は

    r = binary[j++]&0xff;
    g = binary[j++]&0xff;
    b = binary[j++]&0xff;
    pixels[i] = 0xff000000|(r<<16)|(g<<8)|b;

ImageIO.read で読み込んだ時点で、
インデックスカラーとグレースケール以外は、TYPE_INT_ARGB に変換してくれればいいのに。


追記メモ
色が変わると言ったのですが、drawImageの品質を
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
を使って上げればもしかしたら防げるかもしれない。

広告

「BufferedImage」の TYPE_4BYTE_ABGR から TYPE_INT_ARGB にする方法” への1件のフィードバック

    […] 「BufferedImage」の TYPE_4BYTE_ABGR から TYPE_INT_ARGB にする方法 「BufferedImage」の TYPE_BYTE_GRAY から TYPE_BYTE_INDEXED にする方法 カテゴリー: […]

    いいね

コメントをどうぞ(承認された後に公開されます。メールアドレスの記入は自由ですが、記入した場合でも一般公開されることはありません)

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中