28

現在、次のコードを使用して、ピクセル値の配列 (元々は java.awt.image.PixelGrabber オブジェクトで作成されたもの) を Image オブジェクトに変換しています。

public Image getImageFromArray(int[] pixels, int width, int height) {
    MemoryImageSource mis = new MemoryImageSource(width, height, pixels, 0, width);
    Toolkit tk = Toolkit.getDefaultToolkit();
    return tk.createImage(mis);
}

ImageIO パッケージのクラスを使用して同じ結果を得ることができるので、AWT Toolkit を使用する必要はありませんか?

Toolkit.getDefaultToolkit() は 100% 信頼できるとは思えず、AWTError がスローされることもありますが、ImageIO クラスは常に利用可能である必要があるため、メソッドの変更に関心があります。

4

6 に答える 6

29

ImageIO を使用せずにイメージを作成できます。ピクセル配列の内容に一致する画像タイプを使用して BufferedImage を作成するだけです。

public static Image getImageFromArray(int[] pixels, int width, int height) {
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            WritableRaster raster = (WritableRaster) image.getData();
            raster.setPixels(0,0,width,height,pixels);
            return image;
        }

PixelGrabber を使用する場合、 を呼び出す前にピクセル配列から RGBA 情報を抽出することを忘れないでくださいgetImageFromArray。PixelGrabber javadocのhandlepixelmethodにこの例があります。これを行ったら、BufferedImage コンストラクターのイメージ タイプがBufferedImage.TYPE_INT_ARGB.

于 2008-09-24T02:08:37.950 に答える
7

ラスターを使用して、で作成したときにさえ取得しましArrayIndexOutOfBoundsExceptionた。しかし、私のために働いた方法を使用しています。BufferedImageTYPE_INT_ARGBsetRGB(...)BufferedImage

于 2009-04-29T22:53:05.773 に答える
3

BufferedImage.getData() の JavaDoc には、「画像データのコピーであるラスター」と書かれています。

このコードは私にとってはうまくいきますが、効率には疑問があります:

        // Получаем картинку из массива.
        int[] pixels = new int[width*height];
            // Рисуем диагональ.
            for (int j = 0; j < height; j++) {
                for (int i = 0; i < width; i++) {
                    if (i == j) {
                        pixels[j*width + i] = Color.RED.getRGB();
                    }
                    else {
                        pixels[j*width + i] = Color.BLUE.getRGB();
                        //pixels[j*width + i] = 0x00000000;
                    }
                }
            }

BufferedImage pixelImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);    
    pixelImage.setRGB(0, 0, width, height, pixels, 0, width);
于 2011-02-03T10:14:57.637 に答える
2

java.awt.Robotを使用してスクリーンショット(または画面の一部)を取得することは成功しましたが、ImageIOを使用するには、メモリイメージソースではなくBufferedImageに保存する必要があります。次に、ImageIOの静的メソッドを1つ呼び出して、ファイルを保存できます。次のようなものを試してください:

// Capture whole screen
Rectangle region = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capturedImage = new Robot().createScreenCapture(region);

// Save as PNG
File imageFile = new File("capturedImage.png");
ImageIO.write(capturedImage, "png", imageFile);
于 2008-09-24T01:51:30.037 に答える
0

私は他の誰もがこの質問の正しい答えを適用しようとするのと同じ問題を抱えていました。私の int 配列は実際に OutOfboundException を取得し、配列の長さはこの後 width*height*3 でなければならないため、もう 1 つのインデックスを追加して修正しました。画像を取得できなかったので、ラスターを画像に設定して修正しました

public static Image getImageFromArray(int[] pixels, int width, int height) {
        BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_ARGB);
        WritableRaster raster = (WritableRaster) image.getData();
        raster.setPixels(0,0,width,height,pixels);
        image.setData(raster); 
        return image;
    }

そして、このようにjframeのラベルに画像を表示すると、画像を見ることができます

    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(new FlowLayout());
    frame.getContentPane().add(new JLabel(new ImageIcon(image)));
    frame.pack();
    frame.setVisible(true);

imageIcon() に画像を設定します。Bufferedimage.TYPE_INT_ARGB を、この型から配列を取得した画像と一致する別のものに変更しようとする最後のアドバイスは非常に重要です。0 と -1 の配列があったので、この型 BufferedImage.TYPE_3BYTE_BGR を使用しました。

于 2016-06-21T15:21:03.130 に答える
0

これは、SO で ImageIO のタグが付けられた最も投票数の多い質問の 1 つであるため、質問が古いものであっても、より良い解決策の余地がまだあると思います。:-)

GitHub の私のオープン ソース imageio プロジェクトのBufferedImageFactory.javaクラスを見てください。

それを使用すると、次のように簡単に記述できます。

BufferedImage image = new BufferedImageFactory(image).getBufferedImage();

PixelGrabberもう 1 つの良い点は、このアプローチは、最悪の場合でも、既にこのスレッドにある に基づいた例とほぼ同じパフォーマンス (時間) を持つことです。ほとんどの一般的なケース (通常は JPEG) では、約 2 倍の速さです。いずれにせよ、メモリ使用量が少なくなります。

副次的なボーナスとして、デフォルトのカラー モデルで int ARGB に変換される代わりに、元の画像のカラー モデルとピクセル レイアウトが保持されます。これにより、追加のメモリが節約される場合があります。

(PS: ファクトリは、サブサンプリング、関心領域、進行状況リスナーもサポートしています。興味のある方はどうぞ。:-)

于 2013-06-04T20:09:12.830 に答える