# Unable to convolve src image



## new exception (18. Apr 2010)

hallo,

ich wollte über ein Bild einen Weichzeichnungsfilter drüber laufen lassen. Warum kommt immer diese Exception? "Unable to convolve src image"


```
float weight = 1.0f / 9.0f;
        float[] elements = new float[9];
        
        for (int i = 0; i < 9; i++) {
            elements[i] = weight;
        }

        try {
            Kernel myKernel = new Kernel(3, 3, elements);
            ConvolveOp op = new ConvolveOp(myKernel);
            img = op.filter(img, null);
        } catch (ImagingOpException e) {
            System.err.println("FEHLER: " + e.getLocalizedMessage());
        }
        this.repaint();
```

Danke

Edit: img = natürlich nicht null!


----------



## Developer_X (18. Apr 2010)

Vom Weichzeichnen habe ich zwar noch nie was gehört, also das mit dem Kernel, aber vielleicht liegts hier dran:

```
img = op.filter(img, null);
```
An dem null. Ich weiß nicht.

Zeig doch mal die Exception, damit ich dir genauer helfen kann.

Developer_X


----------



## new exception (18. Apr 2010)

wenn ich statt null ein anderes bufferedimage nehme, funktionierts auch nicht.


```
java.awt.image.ImagingOpException: Unable to convolve src image
        at java.awt.image.ConvolveOp.filter(ConvolveOp.java:180)
        at imageeditorfiltertest.ImagePanel.weichzeichnen(ImagePanel.java:70)
        at imageeditorfiltertest.Filter.jButton5ActionPerformed(Filter.java:160)
        at imageeditorfiltertest.Filter.access$400(Filter.java:21)
        at imageeditorfiltertest.Filter$5.actionPerformed(Filter.java:91)
        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:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2475)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```

Zeile 70 ist eben genau die Zeile mit dem op.filter.

danke


----------



## Developer_X (18. Apr 2010)

new exception hat gesagt.:


> wenn ich statt null ein anderes bufferedimage nehme, funktionierts auch nicht.



Nein nein, ich meine das hier:

```
img = op.filter(img, null);
```
Einmal übergibst du ja IMG, aber das andere ist null.

Das habe ich in der API gefunden:

```
filter
public final BufferedImage filter(BufferedImage src,
                                  BufferedImage dst)Performs a convolution on BufferedImages. Each component of the source image will be convolved (including the alpha component, if present). If the color model in the source image is not the same as that in the destination image, the pixels will be converted in the destination.[B] If the destination image is null, a BufferedImage will be created with the source ColorModel.[/B] The IllegalArgumentException may be thrown if the source is the same as the destination.
```

Les das mal, also es gibt 2 BufferedImages die du übergeben musst. Eins hast du schon, das sry Image, das andere gibts du als null. 

Da steht ja in der API, siehe markierter Text, wenn das Destination Image halt null ist, wird ein anderes Image... ausgegeben, aber keine Exception.

Ich würde einfach folgendes Vorschlagen, änder den Code mal so um, und Poste dann die Ausgabe, vielleicht ist es doch null.


```
if(img==null)
{
System.err.println("Das Image ist null");
System.exit(0);
}
float weight = 1.0f / 9.0f;
        float[] elements = new float[9];
        
        for (int i = 0; i < 9; i++) {
            elements[i] = weight;
        }
 
        try {
            Kernel myKernel = new Kernel(3, 3, elements);
            ConvolveOp op = new ConvolveOp(myKernel);
            img = op.filter(img, null);
        } catch (ImagingOpException e) {
            System.err.println("FEHLER: " + e.getLocalizedMessage());
        }
        this.repaint();
```

Dann werden wir ja sehen, ob das Image für den PC null ist oder nicht.

Poste mal die Ausgabe danach


----------



## new exception (18. Apr 2010)

hallo,

wenn ich deinen Code ausführe kommt immer noch als Ausgabe: FEHLER: Unable to convolve src image. Img ist also nicht null.

wenn ich nun schreibe: 
	
	
	
	





```
if (img == null) {
            System.err.println("Das Image ist null");
            System.exit(0);
        }
        float weight = 1.0f / 9.0f;
        float[] elements = new float[9];

        for (int i = 0; i < 9; i++) {
            elements[i] = weight;
        }

        try {
            Kernel myKernel = new Kernel(3, 3, elements);
            ConvolveOp op = new ConvolveOp(myKernel);
            op.filter(img, imgtmp);
        } catch (ImagingOpException e) {
            System.err.println("FEHLER: " + e.getLocalizedMessage());
        }
        this.repaint();
```
ändert sich auch nichts. Immer noch der gleiche Fehler.

img wird so erzeugt:

```
try {
            img = ImageIO.read(new File("c:\\test4.jpg"));
        } catch (Exception e) {
            System.out.println("FEHLER! " + e.getLocalizedMessage());
        }
```


----------



## new exception (18. Apr 2010)

Update: 

wenn ich zuerst das Bild in Graustufen konvertiere, kann ich es auch Weichzeichnen...


```
ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(colorSpace, null);
img = op.filter(img, null);
```

sollte ich vielleicht vor dem Weichzeichnen irgendein ColorSpace model setzten? ;(


----------



## Marco13 (19. Apr 2010)

Da gibt's auch glaub' ich einen bug in der bugparade. Versuch' mal das Bild vorher in ein ARGB-Bild umzuwandeln

```
img = ImageIO.read(new File("c:\\test4.jpg"));
BufferedImage img2 = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
img2.getGraphics().drawImage(img,0,0,null);
img = img2;
```
Wenn nicht, sag nochmal bescheid...


----------



## new exception (19. Apr 2010)

Hat funktioniert. 

Danke!


----------

