0

高さマップ(正の値)を含むPythonPILで作成されたpngファイルがあります。

形式は次のとおりです。16ビットのシングルチャネル(グレーレベル)、つまりピクセルあたり16ビット。

私はアンドロイドでファイルを読みましたBitmapFactory.decodeStream(<...data input stream...>);

getWidth()とを介して画像のサイズを正しく取得しますgetHeight()

ただし、Iを呼び出すピクセルをループするとgetPixel(i,j)、次のような負の値が得られます。-16776192 -16250872 -16250872 -16250872 -16250872-16249848...。

代わりに、0から65535の間の正の値を期待しています。

バイナリの値-16250872が1111111111111111111111111111111111111111000010000000100000001000であることを発見しました

これは、情報が最初の16の最下位ビットに依存していることを示しています。

試してみたところgetPixel(i,j)&0xffff、もっともらしい値が得られましたが、エンディアンについてはよくわかりません。抽出された2バイトを反転する必要がありますか?

この変換をよりエレガントでポータブルな方法で行う方法はありますか?

注:ファイルはカラー(RGBA)PNGではなく、ピクセルごとに1つの16ビット値を持つグレーレベルのPNG画像です。

4

2 に答える 2

3

この投稿で行った考慮事項を使用して、自分で解決策を見つけました: Android:アルファマスクビットマップの読み込み

基本的に、ビットマップファクトリから16ビットグレーレベルPNGを直接ロードすると、ピクセル形式は正しくありません。ピクセルフォーマットをARGB_8888に設定するRGBA32ビットカラーフォーマットを使用する必要があります。次に、getPixel(i、j)ですべてのピクセルを取得し、0xffffで整数値をマスクする必要があります。このようにして、期待される16ビット値を取得します。

これは私が使用したコードの一部です:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig= Bitmap.Config.ARGB_8888;
Bitmap bmp=BitmapFactory.decodeStream(entity.getContent(),null,opt);
int W=bmp.getWidth();
int H=bmp.getHeight();
int px;
for (int i = 0; i < H; i++)
    for (int j = 0; j < W; j++)
    {
          px= bmp.getPixel(j, i)&0x0000ffff;//in px you will find a value between 0 and 65535
          ...
    }
于 2012-05-20T12:03:24.640 に答える
1

画像のピクセルのRGBを取得しようとしていると思います。それが正しければ、次のことが役に立ちます。

指定された場所の色を返します。xまたはyが範囲外の場合(それぞれ幅または高さに対して負または> =)、例外をスローします。

これがBitmap.getPixel()の引用です。

人間が読めるようにこれを印刷するために必要なこと。私はアンドロイドでプログラムしましたが、アンドロイドでこれをしませんでした。私は自分のプログラムの1つに次の関数を使用しました。

public static int[] getRGBValue(BufferedImage bi, int x, int y) {
    int argb = bi.getRGB(x, y);
    int rgb[] = new int[] {
            (argb >> 16) & 0xff, // red
            (argb >>  8) & 0xff, // green
            (argb      ) & 0xff, // blue
    };
    return rgb;
}

public static String getStringOfRGB(int[] value) {
    return "Color: (" + value[0] + ", " + value[1] + ", " + value[2] + ")";
}

私はあなたが何をしようとしているのか正確にはわからないので、上記のコードはあなたの質問に答えません...しかし、あなたがピクセルのデータを使いたいと思う方法であなたの答えを見つけるのを助けるはずです。

お役に立てれば!:)

于 2012-05-20T01:22:11.720 に答える