簡體   English   中英

如何使 java 的 ImageBuffer 正確讀取 PNG 文件?

[英]How do I make java's ImageBuffer to read a PNG file correctly?

出於某種原因,使用 ImageBuffer 和 ImageIO 打開一些 PNG 文件不起作用。 這是我正在使用的一些代碼,可以很好地調整/裁剪 JPG 的大小:

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;

這個 function 的目標是采用給定的任何類型,調整大小並裁剪圖像,然后將其保存為具有相同文件名的 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)

解決方案?

還有另一個我可以完全使用的庫嗎?

在 Windows 上運行我的 function 時,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 版本中有一個錯誤。

egervari,您可以使用諸如imgscalr (Apache 2) 之類的庫來“正確”地為您調整大小,用一個非常簡單的 API解決此類問題——它對裁剪沒有幫助,但調整大小就是它做得最好(不同的速度,質量,甚至是抗鋸齒,如果你願意的話)。

我要指出的是,您現在使用的代碼(將 CUSTOM 類型強制轉換為 3BYTE_BGR 類型)也應考慮具有 alpha 通道的入站圖像。

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

同樣,如果您想嘗試一下,imgscalr 會自動為您處理所有這些,但如果沒有,我想我會提醒您,以防您遇到這些頭痛的問題。

java 圖像處理是……氣質:)

一種解決方法是先將文件轉換為 jpeg,然后再對其進行處理。 0 型錯誤似乎主要影響 PNG 圖像。

暫無
暫無

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

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