# Java Screen Blur Effekt



## radiac (1. Dez 2009)

Und wieder ich .


Okay, jetzt hab ich folgendes Problem...

Ich habe jetzt einen Screenshot von meinem Programm gemacht. Jetzt wollte ich den verschwimmen lassen den Screenshot und auf meinem Aktuellen Bildschirm anzeigen lassen...
Das einzige was ich bekomme ist... SCHWARZ!!!! :lol:

Das ist jetzt etwas spezielle Grafikprogrammierung hier:

Hier mache ich meinen ScreenShot in einer init();

```
...
 // Screenshot
        try {
        rob = new Robot();
	Rectangle captureSize = new Rectangle(0, 0, this.WIDTH, this.HEIGHT);
        ScreenShot = rob.createScreenCapture(captureSize);
    }
    catch(AWTException e) {
    	System.err.println("GEHT NICHT!");
    }    
...
```

Hier könnte evt. das Problem sein, das er hier schon nichts vor die "Linse" bekommt und daher schwarz.

Und dann zu meiner Blur/ Sharp Methode:


```
public void drawBlur(Graphics g) {
        if (!blurEffect) return;

        Graphics2D g2d=(Graphics2D)g;

        BufferedImage biSrc = ScreenShot;
        ScreenShot = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
        biSrc.createGraphics().drawImage(ScreenShot, 0, 0, this);
        
        BufferedImage biDest = ScreenShot;
        ScreenShot = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
        biDest.createGraphics().drawImage(ScreenShot, 0, 0, this);

        // Matrix-feslegung
        float data[] = {1.0f, 0.0f, -1.0f,
                        1.0f, 0.0f, -1.0f,
                        1.0f, 0.0f, -1.0f};
        Kernel kernel = new Kernel(3,3,data);
        
        // Anwenden der Matrix auf Screenshot
        ConvolveOp convolve = new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);
        convolve.filter(biSrc, biDest);
        
        g2d.drawImage(biDest,0,0,this.getWidth(),this.getHeight(),null); // small zum test
        }

[/JavA]
Am Ende wird drawBlur(g) in der PaintMethode aufgerufen.

Was mach ich hier falsch???
Würde mich auf eine gute Hilfestellung freuen :D


Viele Grüße Radiac
```


----------



## javimka (1. Dez 2009)

Ich glaube, du machst da ein kleines Chaos mit Screenshot und biSrc. Du willst doch den Screenshot auf biSrc kopieren oder? Das müsste dann etwa so gehen:

```
BufferedImage biSrc = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
        biSrc.createGraphics().drawImage(ScreenShot, 0, 0, this);
```
Für biDest analog.

Müsste die Summe der Einträge des Kernel nicht optimalerweise 1 geben? Aber vielleicht willst du es ja auch anders.

Um herauszufinden, ob das Bild vielleicht schon vorher schwarz war, könntest du es ja einmal ohne die Filter zeichnen lassen. Und this.WIDTH und this.HEIGHT werden sicher grösser als 0 sein oder?


----------



## radiac (2. Dez 2009)

Huhu.

Jo Stimmt. Da hab ich nach und nach bei meinen Versuchen wirr warr eingebaut .

Richtig sollte es ja jetzt so sein, oder?


```
public void drawBlur(Graphics g) {
        if (!blurEffect) return;

        Graphics2D g2d=(Graphics2D)g;

        BufferedImage biSrc = new BufferedImage(200,170,BufferedImage.TYPE_INT_RGB);
        biSrc.createGraphics().drawImage(ScreenShot, 0, 0, this);
        
        BufferedImage biDest = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
        biDest.createGraphics().drawImage(ScreenShot, 0, 0, this);

        // Matrix-feslegung
        float data[] = {1.0f, 0.0f, -1.0f,
                        1.0f, 0.0f, -1.0f,
                        1.0f, 0.0f, -1.0f};
        Kernel kernel = new Kernel(3,3,data);
        
        // Anwenden der Matrix auf Screenshot
        ConvolveOp convolve = new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);
        convolve.filter(biSrc, biDest);
        
        g2d.drawImage(biDest,0,0,this.getWidth(),this.getHeight(),null); // small zum test
        }
```

Leider kommt hier trotzdem ein Black Screen. Hab auch mal anstatt biDest biSrc also das original Bild (Screenshot) ausgeben lassen. der gleiche Effekt.
Dann scheint es wohl am Screenshot zu liegen noch...


----------



## radiac (2. Dez 2009)

-Update-

scheint wohl am Screenshot Part zu liegen.
Hab mal ein willkürliches Bild geladen. Da funktioniert es jetzt.
Doch bei dem Screenshot hab ich so meine Bedenken das der überhaupt funktioniert .


----------



## Steev (2. Dez 2009)

Q: Wieso ist das Bild schwarz???

A: Weil du den Screenshot nicht verwendest!

[Java]BufferedImage biSrc = ScreenShot;
        ScreenShot = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
        biSrc.createGraphics().drawImage(ScreenShot, 0, 0, this);

        BufferedImage biDest = ScreenShot;
        ScreenShot = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
        biDest.createGraphics().drawImage(ScreenShot, 0, 0, this);[/Java]

In obigem Code wird alles was vorher in ScreenShot drinsteht mit einem neuen Image-Objekt überschrieben...

[Java]        float data[] = {1.0f, 0.0f, -1.0f,
                        1.0f, 0.0f, -1.0f,
                        1.0f, 0.0f, -1.0f};
[/Java]

Sollte ein Blur-Matrix nicht vieleicht doch eher wie folgt aussehen? Mit dieser Blur-Matrix überlagerst du doch nur die horizontalen Pixel...

Sollte das ganze nicht vieleicht in etwas so

[Java]        float data[] = {0.0f, 1.0f, 0.0f,
                        1.0f, 0.0f, 1.0f,
                        0.0f, 1.0f, 0.0f};
[/Java]

oder so

[Java]        float data[] = {1.0f, 1.0f, 1.0f,
                        1.0f, 0.0f, 1.0f,
                        1.0f, 1.0f, 1.0f};
[/Java]

oder so

[Java] float[] blurKernel = {
     1/9f, 1/9f, 1/9f,
     1/9f, 1/9f, 1/9f,
     1/9f, 1/9f, 1/9f
 };[/Java]

aussehen?

Hier vieleicht noch ein interessanter Link dazu:
Images in Java 2D


----------



## radiac (2. Dez 2009)

Hi Steev,


also hab das Beispiel mal übernommen, das mit der Burg.
Aber auch hier nur ein freeze Bildschirm.

Ich such mal weiter... das muss doch gehen irgendwie .

Danke für eure Helps!!! :toll:


----------



## radiac (2. Dez 2009)

Hmm, habe festgestellt, das irgendwie der Screenshot nicht funktioniert...

folgendes habe ich zum test mal eingegeben:


```
g.drawImage(Screen, 300, 300, this);
```

Screen wird hier erstellt und ausgegeben...


```
// Screenshot
        try {
        rob = new Robot();
	Rectangle captureSize = new Rectangle(0, 0, this.WIDTH, this.HEIGHT);
        Screen = rob.createScreenCapture(captureSize);
    }
    catch(AWTException e) {
    	System.err.println("GEHT NICHT!");
    }
```

Gibt es eine andere Möglichkeit einen Screenshot zu machen, oder ist diese falsch???


----------



## Steev (2. Dez 2009)

Hi Radiac,

das mit dem Screenshot ist eigendlich korrekt, hier mal ein Beispiel, wo ebenfalls ein Screenshot gemacht wird.

http://www.java-forum.org/spiele-mu.../91814-buffered-image-drucken.html#post581783

BTW:
Kannst du vieleicht etwas mehr Code posten? Ich kann aus dem bisschen Code nicht allzuviel erkennen...


----------



## radiac (2. Dez 2009)

Huhu Steev,


hab auch mal eine Methode gebaut, die mein Screen shooted .

Und siehe da, ein schwarzes Bild...


```
Robot robot = new Robot();

	BufferedImage screenShot = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
	ImageIO.write(screenShot, "PNG", new File("screenShot.PNG"));
```

Liegt definitiv am Panel oder?

-EDIT -

Leicht überschnitten. Ja, sowas ähnliches hab ich auch gebaut, nur mit ausgabe Datei.
Und leider black... .
Hab auch einen FSEM muss man bedenken...

Bild 3 kb Groß...


----------



## radiac (2. Dez 2009)

Gibt es denn keine alternative einen ScreenShot zu machen? Ohne Robot...? Über Paint oder so?


----------



## radiac (2. Dez 2009)

Okay, habs... 

Ist natürlich doof wenn man so doof ist wie ich, und den Screenshot machen lässt, wenn gerade das Programm startet :lol:.

Ich hab es jetzt Zeitgesteuert gemacht und es klappt :bae:.
Nur noch der Blur muss jetzt gehen .

Ich melde mich...


----------



## radiac (2. Dez 2009)

Hmm, okay.. das Blur geht noch nicht so wirklich .


```
public void drawBlur() {
        if (!blurEffect) return;
  
        filteredImage = new BufferedImage(screenShot.getWidth(null),
        screenShot.getHeight(null),
        BufferedImage.TYPE_BYTE_GRAY);

        size = new Dimension();
        size.width = screenShot.getWidth(null);
        size.height = screenShot.getHeight(null);
        setPreferredSize(size);

        Graphics g = filteredImage.getGraphics();
        g.drawImage(screenShot, 0, 0, null);

        float[] blurKernel = {
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f
        };

        BufferedImageOp blur = new ConvolveOp(new Kernel(3, 3, blurKernel));
        screenShot = blur.filter(screenShot, null);
        g.dispose();

        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(screenShot, null, 3, 3);
    }
```

Hab ich da wieder Mist gebaut??? Jedenfalls gehen hier meine FPS in die Knie 

Die Methode wird in Paint aufgerufen.


----------



## radiac (2. Dez 2009)

Okay, jetzt klappt es endlich!!!!! 


Lösung:


```
public void ScreenShot() throws IOException, AWTException{

	    Robot robot = new Robot();

	    screenShot = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

        filteredImage = new BufferedImage(screenShot.getWidth(null), screenShot.getHeight(null), BufferedImage.TYPE_BYTE_GRAY);

        Graphics g = filteredImage.getGraphics();
        g.drawImage(screenShot, 0, 0, null);

        float[] blurKernel = {
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f
        };

        BufferedImageOp blur = new ConvolveOp(new Kernel(3, 3, blurKernel));
        screenShot = blur.filter(screenShot, null);
        g.dispose();
    }

...

public void drawBlur(Graphics g) {
        if (!blurEffect) return;

         g.drawImage(screenShot, 0, 0, null);

    }
```

Danke für eure Hilfe!!!   :toll:


----------

