2

バイト配列はこの方法で取得されます-

BufferedImage image = new Robot().createScreenCapture(new Rectangle(screenDimension));
byte[] array = ((DataBufferByte)getGraycaleImage(image).getRaster().getDataBuffer()).getData();
//  Method getGraycaleImage returns a grayscaled BufferedImage, it works fine

バイト配列からこのグレースケール画像を再構築するにはどうすればよいですか?

ARGB、RGB、またはグレースケール画像についてはよくわかりません。私はこれを試しました-

private Image getGrayscaleImageFromArray(byte[] pixels, int width, int height)
{
    int[] pixels2=getIntArrayFromByteArray(pixels);
    MemoryImageSource mis = new MemoryImageSource(width, height, pixels2, 0, width);
    Toolkit tk = Toolkit.getDefaultToolkit();
    return tk.createImage(mis);
}

private int[] getIntArrayFromByteArray(byte[] pixelsByte)
{
    int[] pixelsInt=new int[pixelsByte.length];
    int i;
    for(i=0;i<pixelsByte.length;i++)
        pixelsInt[i]=pixelsByte[i]<<24 | pixelsByte[i]<<16
| pixelsByte[i]<<8 | pixelsByte[i];  // I think this line creates the problem
    return pixelsInt;
}

この画像を描くときは、白黒ではなく、オレンジやグレーのようなものです。

4

3 に答える 3

6

ColorSpaceグレースケール画像に対応する正しいものを指定する必要があります。

http://technojeeves.com/joomla/index.php/free/89-create-grayscale-image-on-the-fly-in-javaにある例を次に示します。

public static BufferedImage getGrayscale(int width, byte[] buffer) {
    int height = buffer.length / width;
    ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
    int[] nBits = { 8 };
    ColorModel cm = new ComponentColorModel(cs, nBits, false, true,
            Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
    SampleModel sm = cm.createCompatibleSampleModel(width, height);
    DataBufferByte db = new DataBufferByte(buffer, width * height);
    WritableRaster raster = Raster.createWritableRaster(sm, db, null);
    BufferedImage result = new BufferedImage(cm, raster, false, null);

    return result;
}
于 2012-08-28T06:57:16.077 に答える
3

未知の関数やクラスが多すぎるため、ARGB / RGB 2グレーから変換する方法を説明していただければ幸いです:P

ARGBは32ビット/ピクセルなので、すべてのチャネルで8ビットです。アルファチャネルは不透明度であるため、透明度の反対であるため、0は透明です。

RGBは24ビット/ピクセルです。ARGBからRGBに変換するには、アルファチャネルを閉じる必要があります。

RGBからグレースケールに変換するには、次の式を使用する必要があります。

0.2989 * R + 0.5870 * G + 0.1140 * B

したがって、どのバイトがどのチャネルに属しているかを把握する必要があります;)

于 2012-08-28T07:06:17.710 に答える
1

これは機能します。必要な方法で画像タイプを微調整してください。

Image img = new ImageIcon(array).getImage();
BufferedImage image = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
image.createGraphics().drawImage(img, 0, 0, null);
于 2012-08-28T06:57:21.677 に答える