【发布时间】:2011-11-25 15:19:52
【问题描述】:
我正在尝试使用 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);
}
}
【问题讨论】:
-
该代码无法编译。
-
我认为 im = originalImage。和 staic = 静态的。 :)
-
谢谢大家...这些错误仅在我的帖子中,而不是在原始代码中(显然)。很抱歉混淆了。
-
在我看来,您的问题可能是在过滤后的图像被渲染之前进行绘制。
-
气垫船,感谢您为我指明了正确的方向。解决方法是在尝试将其绘制到我的 BufferedImage 中之前强制它在 JLabel 中呈现。