4

これが私の塗装方法です:

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bi.setRGB(0, 0, width, height, rgbIntArray, 0, width);
ImageIO.write(bi, "bmp", new File("C:/Users/Felipe/Desktop/img2.bmp"));

これは、rgbIntArray に入力する方法です。

rgbIntArray = new int[(rgbArray.length / 3)];
int j = 0;
for (int i = 0; i < rgbArray.length; i += 3) 
{
    rgbIntArray[j] = unsignedToBytes(rgbArray[i]) + 
    unsignedToBytes(rgbArray[i + 1]) * 256 +
    unsignedToBytes(rgbArray[i + 2]) * 65536;
    j++;
}

これらの値をテストしましたが、正しいようです。

問題は の最後のパラメーターにあると思います。setRGB「スキャンライン ストライド」を要求します。正直なところ、それが何であるかはわかりません。(しかし、画像の幅である可能性がある場所を見つけました)。他のパラメータは正しいと思います。

結果は次のとおりです。

元の画像:

元画像 http://i.minus.com/jy7iVQxtghO0l.bmp


結果:

結果 http://i.minus.com/jz86D3YkuPPhG.bmp

後で画像を加工します。同じ画像を開いて保存しています。

4

1 に答える 1

0

を初期化する方法はわかりませんrgbArrayが、各行は黒いピクセル (画像の外側) で終わります。rgbArray画像ファイルからバイトを直接読み取って初期化した場合、新しい行を表す場合があります。rgbArrayまたは、正しく初期化していません。

黒いピクセルは、せん断された画像に対角線として表示されます。

これを変更することで、各行の最後にある黒いピクセルをスキップできます。

bi.setRGB(0, 0, width, height, rgbIntArray, 0, width);

これに:

bi.setRGB(0, 0, width, height, rgbIntArray, 0, width + 1);

最後のパラメータ はwidth + 1、基本的に、特定の行が配列内の特定のインデックスで始まる場合、次の行はwidth + 1同じ配列内でより高いインデックスで始まることを示しています。

于 2013-05-04T02:07:18.073 に答える