[英]RGBImageFilter Produces All Black Empty Images
我試圖使用RGBImageFilter在圖像上產生簡單的透明效果,但是在測試過程中,我發現所有過濾的圖像都顯示為空白,並帶有黑色背景。 我將過濾器簡化為簡單的“無操作”過濾器,該過濾器僅返回傳入的RGB值。即使此簡化的NoOp過濾器也會產生空白圖像。 我已經嘗試過以相同的效果導入和導出JPG和PNG。 我已經嘗試過各種示例過濾器,這些過濾器會在互聯網上產生相同的全黑圖像問題。 有人遇到過嗎? 下面的“加載狀態”和“寫入狀態”都返回true,因此我從MediaTracker知道原始圖像已完全加載,並且生成的圖像正在成功寫入。 在此先感謝您的幫助!
這是代碼:
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
class NoOpFilter extends RGBImageFilter {
public NoOpFilter() {
canFilterIndexColorModel = true;
}
public int filterRGB(int x, int y, int rgb) {
return rgb;
}
public static void main(String[] args) throws Exception{
String originalImageLocation = args[0];
String baseFileName = args[1];
String directory = args[2];
ImageIcon originalImage = new ImageIcon(Toolkit.getDefaultToolkit().getImage(originalImageLocation));
NoOpFilter filter2 = new NoOpFilter();
ImageProducer ip = new FilteredImageSource(originalImage.getImage().getSource(), filter2);
Image filteredImage = Toolkit.getDefaultToolkit().createImage(ip);
System.out.println("Load Status: " + ( originalImage.getImageLoadStatus() == java.awt.MediaTracker.COMPLETE));
BufferedImage bim = new BufferedImage( originalImage.getIconWidth(),originalImage.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = bim.createGraphics();
g2.drawImage(filteredImage, 0, 0, null);
g2.dispose();
File file = new File(directory + File.separator + baseFileName + ".png");
file.createNewFile();
boolean status = ImageIO.write(bim, "png", file);
System.out.print("write() status: " + status);
}
}
這是對我有用的修復程序。 在創建上面的fileredImage之后,有必要將過濾后的圖像實際添加到JLabel,並將JLabel添加到JFrame,以便在將其寫入緩沖區並保存到磁盤之前先將其渲染為屏幕:
...
Image filteredImage = Toolkit.getDefaultToolkit().createImage(ip);
ImageIcon swingImage = new ImageIcon(filteredImage);
JFrame frame = new JFrame();
JLabel label = new JLabel(swingImage);
frame.add(label);
frame.setVisible(true);
frame.dispose();
BufferedImage bim = new BufferedImage( originalImage.getIconWidth(),originalImage.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = bim.createGraphics();
g2.drawImage(filteredImage, 0, 0, null);
g2.dispose();
File file = new File(directory + File.separator + baseFileName + ".png");
file.createNewFile();
boolean status = ImageIO.write(bim, "png", file);
System.out.print("write() status: " + status);
}
我還不太明白為什么不能像我想的那樣在屏幕外完全完成此操作,但是在打開JFrame之后立即處置它很容易。 更好的解決方案不需要使用UI組件來執行此操作,因為在這種情況下,我實際上不需要屏幕上顯示的任何東西,而只需要最終產品。
感謝氣墊船為我指明了正確的方向。
您必須調用prepareImage,然后不必使用JLabel解決方法。
Image filteredImage = Toolkit.getDefaultToolkit().createImage(ip);
Toolkit.getDefaultToolkit().prepareImage(filteredImage, -1, -1, null);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.