web-dev-qa-db-ja.com

バッファリングされた画像を画像に、またはその逆に変換する方法は?

実際に私は画像編集ソフトウェアに取り組んでいますが、今はバッファリングされた画像を変換したいです:

  BufferedImage buffer = ImageIO.read(new File(file));

image i.eのような形式で:

  Image image  = ImageIO.read(new File(file));

そうすることは可能ですか??はいの場合、どのように?

21
Arizvi

BufferedImage is a(n) Imageであるため、2行目で実行している暗黙的なキャストは直接コンパイルできます。 Imageが実際にBufferedImageであることがわかっている場合、次のように明示的にキャストする必要があります。

Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;

BufferedImageはImageを拡張するため、Imageコンテナに収まります。ただし、BufferedImageではないものも含め、すべてのImageがそこに収まります。したがって、BufferedImageはBufferedImageを拡張しない限り他のタイプを保持できないため、タイプが一致しない場合、実行時にClassCastExceptionを受け取ることがあります。

25
MetroidFan2002

例:スケーリングしたい「画像」があり、おそらくbufferedImageが必要であり、おそらく「画像」オブジェクトから始めようとしているとしましょう。だから、これはうまくいくと思う... AVATAR_SIZEは、イメージのターゲット幅です。

Image imgData = image.getScaledInstance(Constants.AVATAR_SIZE, -1, Image.SCALE_SMOOTH);     

BufferedImage bufferedImage = new BufferedImage(imgData.getWidth(null), imgData.getHeight(null), BufferedImage.TYPE_INT_RGB);

bufferedImage.getGraphics().drawImage(imgData, 0, 0, null);
11
user2080225

BufferedImageImage のサブクラスです。変換を行う必要はありません。

8
Matthew Farwell

正しい方法は、SwingFXUtils.toFXImage(bufferedImage,null)を使用してBufferedImageをJavaFX Imageインスタンスに変換し、SwingFXUtils.fromFXImage(image,null)を使用して逆演算を行うことです。

必要に応じて、2番目のパラメーターをWritableImageにして、さらにオブジェクトが割り当てられないようにすることができます。

バッファリングされたイメージを保存(または書き込み) して、変更を加えてからイメージとして開くことができます。

編集:

try {
    // Retrieve Image
    BufferedImage buffer = ImageIO.read(new File("old.png"));;
    // Here you can rotate your image as you want (making your magic)
    File outputfile = new File("saved.png");
    ImageIO.write(buffer, "png", outputfile); // Write the Buffered Image into an output file
    Image image  = ImageIO.read(new File("saved.png")); // Opening again as an Image
} catch (IOException e) {
    ...
}
6
Jose Garrido

ただの情報:Imageクラスは実際には抽象クラスであり、BufferedImageでこの変数を参照することは、オブジェクトのメモリアドレスのみを格納または返すことを覚えておいてください。

また、したがって、静的な_Java.awt.image.imageIO_のread()メソッドはBufferedImageオブジェクトを返すため、そのオブジェクトでoperator/expression _instanceof BufferedImage_を使用するとtrue

実際、抽象クラスであるImageクラスには、次のようなメソッドシグネチャがあります。

  1. public abstract Graphics getGraphics()
  2. public abstract ImageProducer getSource()

とりわけ。

私が強調するのは、実際のImage変数は、C、C++、Adaなどのポインタのように、具体的なImageサブクラスオブジェクトのメモリアドレスのみを保持するということです。

これらの言語で導入または高度化された場合、およびJava Runnable、_javax.sound.Clip_、AWTのShapeなどのインターフェイスインスタンス) 。。Imageには次のものがあることに注意してください:public abstract Image getScaledInstance(...)-ポイントを取得します(もちろん、2Dグラフィックスプログラミングのスケーリングはサイズ変更と交換可能で、精度が望ましいため)。

しかし、ImageIOメソッドが! (instanceof BufferedImage)を返すという不可能なケースでは、このBufferedImageをコンストラクター引数の1つに渡して新しいImgObjNotInstncfBufImgオブジェクトを作成するだけです。次に、at(合理的)はコードのロジックでこれを操作します。

とにかく、Affine Transformクラスは、図形や画像をスケーリング、回転、再配置などの形式に変換するのに適しているため、「アフィン変換」の使用について検討することをお勧めします。

このような画像のラスターで実際のピクセルを操作できることに注意してください-技術用語集から参照する必要がある別の技術的な2Dグラフィック用語-おそらくJavaバイナリblitwise操作の方法個々の色属性を32バイト(アルファ値とRGB値ごとに7ビット)のコンパクトに格納するタイプの画像バッファで必要になります。

画像のレイヤー化に使用するのではないかと思います。したがって、最終的には、抽象イメージでBufferedImageのみを参照し、ImageオブジェクトがまだBufferedImageオブジェクトではない場合、合理的です。変換、キャスト、オートボクシングなどを心配することなく、この関連するがBufferedImage以外のインスタンスから画像を作成します。 BufferedImageを操作するということは、実際には、基になるルートイメージのデータを含むオブジェクトが指すことも意味します。

さて、終了しました。私は確かに、あなたが直面していると思われるデッドロックを抽出し、ばらばらにしたと思います。前述したように、Javaの抽象クラスとインターフェースは、他の言語のポインターと呼ばれる低レベルでハードウェアにより近い演算子と非常に同等です。