2011-04-29 47 views
9

出於某種原因,使用ImageBuffer和ImageIO打開一些PNG文件不起作用。下面是一些代碼,我使用的是調整大小/裁切JPG格式正常工作:如何讓java的ImageBuffer正確讀取PNG文件?

BufferedImage image = ImageIO.read(new File(location)); 

BufferedImage croppedImage = image.getSubimage(
    cropInfo.getX(), cropInfo.getY(), cropInfo.getW(), cropInfo.getH()); 

BufferedImage resizedImage = new BufferedImage(
    TARGET_WIDTH, TARGET_HEIGHT, croppedImage.getType()); 
Graphics2D g = resizedImage.createGraphics(); 
g.drawImage(croppedImage, 0, 0, TARGET_WIDTH, TARGET_HEIGHT, null); 
g.dispose(); 

this.changeContentType("image/png", ".png"); // not really relevant. just a property 

ImageIO.write(resizedImage, "png", new File(location)); 

return resizedImage; 

該功能的目的是要採取任何形式,則調整大小和裁剪圖像,然後將其保存爲PNG與同文件名。

它適用於Windows,但如果我在Linux(lenny)上裁剪/調整大小,它會崩潰並抱怨文件類型(它表示類型爲0)。

java.lang.IllegalArgumentException: Unknown image type 0 
    java.awt.image.BufferedImage.<init>(BufferedImage.java:490) 
    trainingdividend.domain.file.ServerImage.resizeImage(ServerImage.java:68) 
    trainingdividend.domain.file.ServerImage.cropAndResize(ServerImage.java:80) 
    trainingdividend.service.user.UserAccountManagerImpl.cropAvatar(UserAccountManagerImpl.java:155) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

解決方案?

是否還有其他庫可以使用?

+0

您在Linux中使用哪種JVM? (編輯:由堆棧跟蹤中的'sun.reflect'判斷,這是Sun的,但只是可以肯定) – 2011-04-29 20:28:00

+0

是的,最新的sun jvm。 1.6_24 – egervari 2011-04-29 20:48:49

+0

嗯,我修好了。我把黑客放在那裏,如果image.getType()== 0,我手動將它設置爲5.這有效。 – egervari 2011-04-29 21:00:32

回答

4

在Windows上運行我的函數時,croppedImaged.getType()返回值5.因此,簡單的「hack」是存儲類型,檢查它是否爲0 ...,如果是,請設置值手動5。

int imageType = croppedImage.getType(); 
if(imageType == 0) imageType = 5; 

然後,我們通過在IMAGETYPE,而不是它應該在Linux上運行。

我相信這有缺點,如果在其他情況下值爲0,它會將其設置爲5,這將是錯誤的。但是,這似乎適用於Linux上的常見圖像類型,並沒有造成任何問題。

很明顯,Java 1.6的Windows版本非常好,但Linux版本中有一個bug。

1

egervari,您可以像使用imgscalr(Apache 2的)庫來完成所有的調整大小爲你「正確」能解決這樣的問題,與very simple API - 它不會與裁剪幫助,但調整大小它做得最好(不同的速度,質量,如果你想要的話,甚至是抗鋸齒)。

我想指出你現在使用的代碼(強制CUSTOM類型爲3BYTE_BGR類型)也應該考慮帶有Alpha通道的入站圖像。

此外,如果您想要繼續使用自定義代碼,則RGB和ARGB是Java2D中支持的最佳圖像類型之一 - 如果您使用的圖像類型支持得不好,則當Java2D執行圖像操作時,回到它的軟件渲染管道,並且不使用專門的硬件加速。這不僅僅會影響性能,因爲您會發現結果實際上看起來更糟(例如,在GIF中,您會看到很多)。

再次,imgscalr會自動爲您處理所有這些問題,如果您想嘗試一下,但是如果不是,我想我只是小心翼翼地避免遇到這些頭痛問題。

java的圖像處理...氣質:)

0

一種解決的辦法是將文件轉換第一個JPEG,然後再處理它。類型0錯誤似乎主要影響PNG圖像。

相關問題