Java RGBImageFilter生成所有黑色空图像
我试图使用RGBImageFilter在图像上产生一个简单的透明度效果,但是在测试过程中,我发现所有过滤后的图像都是黑色背景的空白。我将过滤器简化为一个简单的“无操作”过滤器,它只返回传入的RGB值。即使这个简化的NoOp过滤器也会生成一个空白图像。我尝试过以同样的效果导入和导出JPG和PNG。我已经尝试过互联网上的各种过滤器,它们会产生相同的全黑图像问题。以前有人遇到过这种情况吗?下面的“加载状态”和“写入状态”都返回true,因此我从MediaTracker知道原始图像正在完全加载,并且生成的图像正在成功写入。提前感谢您的帮助! 代码如下:Java RGBImageFilter生成所有黑色空图像,java,image,graphics,awt,Java,Image,Graphics,Awt,我试图使用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);
那段代码无法编译。我认为im=originalImage。和staic=静态。:)谢谢大家。。。这些错误只出现在我的帖子中,而不是原始代码中(显然)。很抱歉弄错了。我认为您的问题可能是在绘制FilterDimage之前使用了它。气垫船,谢谢您为我指明了正确的方向。修复方法是在尝试将其绘制到我的BuffereImage之前,强制在JLabel中呈现它。