0

JNI を使用して、次の形式で生の画像データを取得しています。

画像データは、画像の左上から右下に、各行が左から右に進む線形配列のピクセルあたり DATA32 (32 ビット) の形式で返されます。各ピクセルには、上位 8 ビットがアルファ チャネルとしてあり、下位 8 ビットが青チャネルであるため、ピクセルのビットは ARGB (最上位から最下位まで、チャネルごとに 8 ビット) です。ある時点でデータを戻す必要があります。

C では、DATA32 形式は基本的に unsigned int です。

だから私は int[] 配列を取得し、それから Buffered Image を作成しようとします

        int w = 1920;
        int h = 1200;

        BufferedImage b = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 


        int[] f = (new Capture()).capture();
        for(int i = 0; i < f.length; i++){;
                b.setRGB(x, y, f[i]);
        }

f は、ピクセル データの配列です。

Java のドキュメントによると、これは BufferedImage.TYPE_INT_ARGB が次のように動作するはずです。

整数ピクセルにパックされた 8 ビット RGBA カラー コンポーネントでイメージを表します。画像には、アルファ付きの DirectColorModel があります。このイメージのカラー データは、事前にアルファが乗算されていないと見なされます。この型を BufferedImage コンストラクターの imageType 引数として使用すると、作成されるイメージは JDK1.1 以前のリリースで作成されたイメージと一致します。

8ビットRGBAでない限り、すべてのコンポーネントを合計して8ビットでエンコードすることを意味しますか? しかし、これは不可能です。

このコードは機能しますが、生成される画像は、生成されるはずの画像とはまったく異なります。大量のアーティファクトがあります。誰かがここで何か明らかに間違っているのを見ることができますか?

でピクセルデータを取得することに注意してください

imlib_context_set_image(im);
data = imlib_image_get_data();

私のCコードでは、api http://docs.enlightenment.org/api/imlib2/html/imlib2_8c.html#17817446139a645cc017e9f79124e5a2でライブラリimlib2を使用しています

4

1 に答える 1

0

私はアホです。

これは単なるバグです。

上記の x、y の計算方法を含めるのを忘れていました。

基本的に私が使っていた

 int x = i%w;
 int y = i/h;

for ループで、これは間違っています。する必要があります

 int x = i%w;
 int y = i/w;

こんなばかげた間違いをしたなんて信じられない。

于 2009-05-19T01:37:24.277 に答える