RGBImageFilter生成所有黑色空图像

时间:2011-09-27 00:00:51

标签: 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);

    }

}

2 个答案:

答案 0 :(得分:1)

这是适用于我的修复程序。在创建上面的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组件来执行此操作,因为在这种情况下我并不需要在屏幕上显示任何内容而只需要最终产品。

感谢气垫船把我指向了正确的方向。

答案 1 :(得分:0)

您必须调用prepareImage,然后您不必使用JLabel解决方法。

Image filteredImage = Toolkit.getDefaultToolkit().createImage(ip);
Toolkit.getDefaultToolkit().prepareImage(filteredImage, -1, -1, null);