簡體   English   中英

如何將緩沖的圖像轉換為圖像,反之亦然?

[英]How to convert buffered image to image and vice-versa?

其實我正在研究圖像編輯軟件,現在我想轉換緩沖圖像,即:

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

到圖像,即格式如下:

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

有可能嗎? 如果是,那怎么樣?

BufferedImage 是一個(n)圖像,因此您在第二行中執行的隱式轉換可以直接編譯。 如果你知道一個Image真的是一個BufferedImage,你必須像這樣明確地轉換它:

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

因為BufferedImage擴展了Image,所以它可以放在Image容器中。 但是,任何Image都可以適合那里,包括那些不是BufferedImage的Image,因此如果類型不匹配,你可能會在運行時獲得ClassCastException,因為BufferedImage除非擴展BufferedImage,否則不能保存任何其他類型。

例如:假設你有一個想要擴展的'圖像',你可能需要一個bufferedImage,並且可能只是從'Image'對象開始。 所以我認為這是有效的... 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);

BufferedImageImage的子類。 您無需進行任何轉換。

正確的方法是使用SwingFXUtils.toFXImage(bufferedImage,null)將BufferedImage轉換為JavaFX Image實例,使用SwingFXUtils.fromFXImage(image,null)進行逆操作。

可選地,第二參數可以是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) {
    ...
}

只是一個信息:讓我們都記住Image類實際上是一個抽象類,並使用BufferedImage引用它的變量只存儲或返回任何Object的內存地址。

此外,靜態java.awt.image.imageIOread()方法返回一個BufferedImage對象,因此毫無疑問,在該對象上使用運算符/表達式instanceof BufferedImage將返回true

實際上,作為抽象, Image類具有以下方法簽名:

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

等等。

我強調,實際的Image變量只保存具體Image-subclass對象的內存地址,幾乎就像C,C ++,Ada等中的指針一樣。

如果您使用這些語言介紹或高級,還有Java接口實例,如Runnablejavax.sound.Clip ,AWT的Shape等等。 注意Image有: public abstract Image getScaledInstance(...) - 你明白了。 (當然,2D圖形編程中的縮放可以與調整大小互換,因此需要精度)。

但在一個不可能的情況下,這里ImageIO方法返回! (instanceof BufferedImage) ! (instanceof BufferedImage)只是創建一個新的BufferedImage對象,其ImgObjNotInstncfBufImg包含在其構造函數參數之一中。 然后,在(理性)將在代碼的邏輯中操縱它。

無論如何,仿射變換類適用於將形狀和圖像轉換為縮放,旋轉,重定位等形式,因此我建議您研究使用“仿射變換”。

請注意,您可以操縱此類圖像柵格中的實際像素 - 這是另一個必須從技術詞匯表中引用的技術2D圖形術語 - 在圖像緩沖區的類型中,可能需要以Java方式進行二進制blitwise操作的精通技巧將單個顏色屬性存儲在32字節的緊湊中 - 每個7位用於alpha和RGB值。

我懷疑你會用它來分層圖像。 所以,最后,理性的是你只用抽象的Image引用BufferedImage ,如果你的Image對象還不是BufferedImage ,那么你可以用這個相關但非BufferedImage實例制作一個圖像。無需擔心任何轉換,鑄造,自動裝箱等等; 操縱BufferedImage實際上意味着還要操縱它所指向的基礎圖像數據承載對象。

好的,完成了; 我想我肯定已經解開了你可能認為你所面臨的僵局。 正如我所說的java中的抽象類以及接口,非常類似於其他語言中稱為指針的低級,更接近硬件的運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM