2015-09-05 55 views
1

我需要將BufferedImage保存爲png圖像。下一步,我需要在另一個程序(Avisynth)中打開圖像。這個程序能夠打開我在ms-paint中繪製的圖像,但是我的java程序創建的圖像無法打開。來自我的程序和ms-paint的圖像是png類型的,而在windows中看起來不錯。這意味着我可以打開它,而圖像包含了我繪製的所有內容。 在外部程序,它拋出以下錯誤:JAVA:如何從BufferedImage創建「PNG」圖像。圖像必須可以在DevIL庫中打開

Avisynth open failure: 
ImageReader error 'Could not open file' in DevIL library. 
reading image"C:\Images\mask\mirror.png" 
DevIL version 166. 
(C:\User\admin\Documents\4555.avs) 

這裏是代碼。我甚至用評論線嘗試過。我在google上發現了一些東西。該消息對於不好的圖像格式是典型的。但我不知道如何做像ms-paint一樣的圖像。

BufferedImage img = new BufferedImage(video.getWidth(), video.getHeight(), BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2 = (Graphics2D) img.getGraphics(); 
    img.getGraphics().setColor(Color.white); 
    c.paintAll(img.getGraphics()); 
    File f = new File(path + ".png"); 

    opencv_core.IplImage imgs = IplImage.createFrom(img); 
    opencv_highgui.cvSaveImage(f.getPath(), imgs); 
    //ImageIO.write(img, "png", f); 

在代碼:

c is JComponent, whitch contains the image, whitch I want to save, and I used JavaCL library

+0

你可以附上不好的圖像嗎?你用'ImageIO.write'(註釋掉的代碼)得到同樣的問題嗎? – haraldK

+0

是的,我使用ImageIO.write時遇到了同樣的問題。 –

+0

這裏是鏈接文件:http://rabcan.wz.cz/temp。rar –

回答

1

讀/寫一個BufferedImage,你可以使用javax.imageio.ImageIO中。您還可以添加TwelveMonkeys擴展,它可以改善使用imageio的I/O操作。

另一種解決方案是使用JAI,但在閱讀圖像時存在內存泄漏問題。

png格式是一個標準,幾乎所有的庫/軟件都支持。如果Avisynth無法打開使用您的Java軟件創建的圖像,那肯定是因爲您將它保存爲罕見的格式。

+0

javax.imageio.ImageIO能夠做到這一點,謝謝 –

+0

TwelveMonkey加速了png上的IO操作......以防萬一您需要更好的性能。 – FiReTiTi

+0

@FiReTiTi當有人引用TwelveMonkeys庫(我是它的主要作者)時,我總是很高興。然而,在這種情況下,我認爲這不會有所作爲。圖書館沒有PNG插件(我打算有一天加入更快的'PNGImageWriter')。不過感謝您的信任! ;-) – haraldK

1

我看了一下你附加的圖片,我都認爲它們都是完全有效的PNG文件,並且在我試過的任何瀏覽器/庫中打開。它們都使用標準的放氣壓縮,自適應濾波並且是非隔行的。

但是,有一個重要的區別,那就是用Java編寫的文件具有透明度(alpha通道),而Paint不支持。圖像都沒有透明像素,所以你可以嘗試只是扔掉Alpha通道,並看看是否有幫助(只能改變你的代碼的第一行):

int w = video.getWidth(); 
int h = video.getHeight(); 
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); 

TYPE_3BYTE_BGR是什麼的ImageIO PNGReader回報對於一個不透明的PNG,所以它可能更快,但你也可以使用TYPE_INT_RGB我認爲。

這個代碼的小小變化應該會產生一個更接近Paint創建的圖像。我很有信心,這種改變應該會產生一個Devil/Avisynth可以讀取的PNG。 (也有另一個圖像之間的小差異,即油漆圖像明確包含sRGB塊(和一些其他輔助塊),但這應該不重要)。

除此之外,我看到DevIL正在使用LibPNG(這可能是最標準和最廣泛使用的PNG庫)讀取PNG,所以我發現它看起來不能讀取這個特定的PNG。但是,它可能是關於這個版本的東西,它構建的方式或者其他東西(我不是C/C++程序員,也不深入瞭解庫)。您可能應該與圖書館/程序的開發人員討論(向其提出問題)。