右の配列のピクセルイメージオブジェクトにJavaのImageIO?
-
02-07-2019 - |
質問
私は現在、転配列のピクセル値(もともと作成されたjava.awt.イメージです。PixelGrabberオブジェクト)をイメージオブジェクトを次のコード:
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パッケージ(s)とは思えないのAWTツールキット?
います。getDefaultToolkit()するものではありません100%信頼できることがあり捨てるAWTErrorは、ImageIOの授業を常に利用できるかに興味がある私にとっての変更方法です。
解決
を作成することができ画像を用いずに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
.がこの handlepixelmethod のPixelGrabber javadoc.まだ、ただの画像タイプのBufferedImageコンストラクタ BufferedImage.TYPE_INT_ARGB
.
他のヒント
のrasterをもらった ArrayIndexOutOfBoundsException
でも私が作成した BufferedImage
と TYPE_INT_ARGB
.しかし、 setRGB(...)
方法 BufferedImage
勤務しました。
JavaDocにBufferedImage.getData()はいう。"Rasterである コピー 画像のデータです。"
このコードの作品が私にとってもっところで効率:
// Получаем картинку из массива.
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);
また利用するjava.awt.ロボットを鷲掴みにし、画面(またはセグメントの画面のように)作ImageIOする必要がありま大切に保管してくださのBufferedImageの代わりにメモリイメージソースです。そのまま呼び出しますstaticメソッドのImageIO、ファイルを保存します。うようなもの:
// 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);
この投票を行うタグを付けImageIOになると思いがまだまだシーンもの。:-)
というものが BufferedImageFactory.java クラスからオープンソースimageioプロジェクトに関する知識
でも、書き:
BufferedImage image = new BufferedImageFactory(image).getBufferedImage();
その他の良いものはこのアプローチとして、最悪の場合と同じ性能(時間)としての PixelGrabber
に基づく事例です。ほとんどの場合には、通常、JPEG)で約倍のスピードが遅かった。いずれに使用。
としての側ボーナスのカラーモデルおよびピクセルのレイアウトは、オリジナルイメージは、翻訳int ARGBデフォルトの色モデルです。この保存追加。
(PS:の工場にも対応サブサンプリング、関心領域および進捗リスナーのリスな興味がありました。:-)
私は同じような問題の全ての皆様へのご連絡は下記より受け付けての正しい答えの質問は、私のint配列から、一緒に試してみましょう、OutOfboundException所まで追加指数が配列の長さはwidht*高-3の後にこんなの画像で固定で設定rasterのイメージに
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);
設定の画像はイメージアイコン().最後の助言を試すことができます変化のBufferedimage.TYPE_INT_ARGBになっても、他のものに一致する画像または配列からこのタイプは非常に重要なたの配列の0-1で使用したこのBufferedImage.TYPE_3BYTE_BGR