2012-06-17 104 views
2

我想对图像应用平滑滤镜。但我得到这个错误:java图像卷积

java.awt.image.ImagingOpException: Unable to convolve src image 
at java.awt.image.ConvolveOp.filter(ConvolveOp.java:180) 
at ocr.Resolution.smoothing(Resolution.java:102) 
at ocr.Interface$ButtonListener.actionPerformed(Interface.java:332) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
at java.awt.Component.processMouseEvent(Component.java:6038) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260) 
at java.awt.Component.processEvent(Component.java:5803) 
at java.awt.Container.processEvent(Container.java:2058) 
at java.awt.Component.dispatchEventImpl(Component.java:4410) 
at java.awt.Container.dispatchEventImpl(Container.java:2116) 
at java.awt.Component.dispatchEvent(Component.java:4240) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) 
at java.awt.Container.dispatchEventImpl(Container.java:2102) 

我已经研究,但找不到任何确切的解决方案。要查看问题的根源,我已经将图像加载为图标。他们都还好。这个问题的原因可能是图像加载后,所以它不能应用过滤器?

另外,我也会应用细化算法和其他一些滤镜。你认为如果在Processing而不是Java中做得更好?感谢您的任何帮助。

 filter = new float[] { 1.0f/121.0f, 2.0f/121.0f, 3.0f/121.0f, 2.0f/121.0f, 1.0f/121.0f, 
          2.0f/121.0f, 7.0f/121.0f, 11.0f/121.0f, 7.0f/121.0f, 2.0f/121.0f, 
          3.0f/121.0f, 11.0f/121.0f, 17.0f/121.0f, 11.0f/121.0f, 3.0f/121.0f, 
          2.0f/121.0f, 7.0f/121.0f, 11.0f/121.0f, 7.0f/121.0f, 2.0f/121.0f, 
          1.0f/121.0f, 2.0f/121.0f, 3.0f/121.0f, 2.0f/121.0f, 1.0f/121.0f}; 
    kernelWidth = 5; 
    kernelHeight = 5; 
    BufferedImageOp bufOp ; 
    BufferedImage bufImg; 
    Image img; 

    img = Toolkit.getDefaultToolkit().getImage(Interface.picPath); //load image   
    ImageSize size = new ImageSize(img);// instance to get image dimensions 
    bufImg = new BufferedImage (size.getwidth(),size.getheight(),BufferedImage.TYPE_INT_RGB); 
    try { 
    bufImg = ImageIO.read(new File(Interface.picPath)); 

    } catch (IOException ex) { 
    Logger.getLogger(Resolution.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    kernel = new Kernel(kernelWidth, kernelHeight, filter); 
    bufOp = new ConvolveOp(kernel); 
    bufImg = bufOp.filter(bufImg, null); 
+1

什么是堆栈跟踪? – SLaks

+0

我刚编辑过 – Ecrin

回答

4

我已经找到了解决办法。我没有使用URl创建BufferedImage(bufImg),而是将图像本身(img)转换为BufferedImage,现在它运行。

public void smoothing(){ 
    filter = new float[] { 1.0f/121.0f, 2.0f/121.0f, 3.0f/121.0f, 2.0f/121.0f, 1.0f/121.0f, 
          2.0f/121.0f, 7.0f/121.0f, 11.0f/121.0f, 7.0f/121.0f, 2.0f/121.0f, 
          3.0f/121.0f, 11.0f/121.0f, 17.0f/121.0f, 11.0f/121.0f, 3.0f/121.0f, 
          2.0f/121.0f, 7.0f/121.0f, 11.0f/121.0f, 7.0f/121.0f, 2.0f/121.0f, 
          1.0f/121.0f, 2.0f/121.0f, 3.0f/121.0f, 2.0f/121.0f, 1.0f/121.0f}; 
    kernelWidth = 5; 
    kernelHeight = 5; 
    kernel = new Kernel(kernelWidth, kernelHeight, filter); 
    op = new ConvolveOp(kernel); 

    img = Toolkit.getDefaultToolkit().getImage(Interface.picPath); 
    imageToBufferedImage(img); 
    bufImg = op.filter(bufImg, null); 

    icon = new ImageIcon(img.getScaledInstance(175, 175, Image.SCALE_DEFAULT)); 
    icon2 = new ImageIcon(img.getScaledInstance(300, 300, Image.SCALE_DEFAULT)); 
    Interface.label3.setIcon(icon); 
    Interface.label8.setIcon(icon2); 

} 

public void imageToBufferedImage(Image im) { 
    ImageSize size = new ImageSize(im); 
    bufImg = new BufferedImage (size.getwidth(), size.getheight(),BufferedImage.TYPE_INT_RGB); 
    Graphics graph = bufImg.getGraphics(); 
    graph.drawImage(im, 0, 0, null); 
    graph.dispose(); 

}