2014-03-30 7 views

Antwort

7

Dies ist ein interessanter. Ich dachte zuerst, dass es eine einfache Lösung geben sollte, mit einigen Graphics#drawRoundRect Anruf mit der entsprechenden Paint, aber es ist nicht sooo einfach.

ist jedoch eine Lösung in dem folgende Beispiel implementiert:

Das Bild gemalt wird in ein neues Bild als-it-ist. Dann werden die Kanten und Ecken bemalt. Diese bestehen aus Rechtecken. Jedes Rechteck für eine Kante wird mit einer GradientPaint gefüllt, die zwischen "vollständig transparent" und "vollständig undurchsichtig" interpoliert. In ähnlicher Weise werden die Rechtecke für die Ecken mit einer RadialGradientPaint gefüllt, die zwischen den gleichen Farben interpoliert. Diese werden mit der Kompositionsregel AlphaComposite.DstOut gemalt, so dass die tatsächlichen Pixel des Bildes langsam zum Rand hin "ausgeblendet" werden.

enter image description here

(Das Schachbrettmuster wird nur im Hintergrund der Komponente gemalt, zu betonen, dass es in Richtung transparent Pixel an der Grenze iterpolates)

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.MultipleGradientPaint.CycleMethod; 
import java.awt.RadialGradientPaint; 
import java.awt.geom.Point2D; 
import java.awt.geom.Rectangle2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 


public class BorderBlurTest 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     BufferedImage input = null; 
     try 
     { 
      input = ImageIO.read(new File("KCR0B.jpg")); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     BufferedImage output = blurBorder(input, 20); 
     f.getContentPane().setLayout(new GridLayout()); 
     f.getContentPane().add(new ImagePanel(input)); 
     f.getContentPane().add(new ImagePanel(output)); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static BufferedImage blurBorder(BufferedImage input, double border) 
    { 
     int w = input.getWidth(); 
     int h = input.getHeight(); 
     BufferedImage output = new BufferedImage(
      w, h, BufferedImage.TYPE_INT_ARGB); 

     Graphics2D g = output.createGraphics(); 
     g.drawImage(input, 0, 0, null); 

     g.setComposite(AlphaComposite.DstOut); 
     Color c0 = new Color(0,0,0,255); 
     Color c1 = new Color(0,0,0,0); 

     double cy = border; 
     double cx = border; 

     // Left 
     g.setPaint(new GradientPaint(
      new Point2D.Double(0, cy), c0, 
      new Point2D.Double(cx,cy), c1)); 
     g.fill(new Rectangle2D.Double(
      0, cy, cx, h-cy-cy)); 

     // Right 
     g.setPaint(new GradientPaint(
      new Point2D.Double(w-cx, cy), c1, 
      new Point2D.Double(w,cy), c0)); 
     g.fill(new Rectangle2D.Double(
      w-cx, cy, cx, h-cy-cy)); 

     // Top 
     g.setPaint(new GradientPaint(
      new Point2D.Double(cx, 0), c0, 
      new Point2D.Double(cx, cy), c1)); 
     g.fill(new Rectangle2D.Double(
      cx, 0, w-cx-cx, cy)); 

     // Bottom 
     g.setPaint(new GradientPaint(
      new Point2D.Double(cx, h-cy), c1, 
      new Point2D.Double(cx, h), c0)); 
     g.fill(new Rectangle2D.Double(
      cx, h-cy, w-cx-cx, cy)); 


     // Top Left 
     g.setPaint(new RadialGradientPaint(
      new Rectangle2D.Double(0, 0, cx+cx, cy+cy), 
      new float[]{0,1}, new Color[]{c1, c0}, CycleMethod.NO_CYCLE)); 
     g.fill(new Rectangle2D.Double(0, 0, cx, cy)); 

     // Top Right 
     g.setPaint(new RadialGradientPaint(
      new Rectangle2D.Double(w-cx-cx, 0, cx+cx, cy+cy), 
      new float[]{0,1}, new Color[]{c1, c0}, CycleMethod.NO_CYCLE)); 
     g.fill(new Rectangle2D.Double(w-cx, 0, cx, cy)); 

     // Bottom Left 
     g.setPaint(new RadialGradientPaint(
      new Rectangle2D.Double(0, h-cy-cy, cx+cx, cy+cy), 
      new float[]{0,1}, new Color[]{c1, c0}, CycleMethod.NO_CYCLE)); 
     g.fill(new Rectangle2D.Double(0, h-cy, cx, cy)); 

     // Bottom Right 
     g.setPaint(new RadialGradientPaint(
      new Rectangle2D.Double(w-cx-cx, h-cy-cy, cx+cx, cy+cy), 
      new float[]{0,1}, new Color[]{c1, c0}, CycleMethod.NO_CYCLE)); 
     g.fill(new Rectangle2D.Double(w-cx, h-cy, cx, cy)); 

     g.dispose(); 

     return output; 
    } 


    static class ImagePanel extends JPanel 
    { 
     private final BufferedImage image; 

     ImagePanel(BufferedImage image) 
     { 
      this.image = image; 
     } 

     @Override 
     public Dimension getPreferredSize() 
     { 
      if (super.isPreferredSizeSet()) 
      { 
       return super.getPreferredSize(); 
      } 
      return new Dimension(image.getWidth(), image.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 
      int s = 8; 
      int w = getWidth(); 
      int h = getHeight(); 
      for (int x=0; x<w; x++) 
      { 
       for (int y=0; y<h; y++) 
       { 
        if (((x+y) & 1) == 0) 
        { 
         g.setColor(Color.WHITE); 
        } 
        else 
        { 
         g.setColor(Color.LIGHT_GRAY); 
        } 
        g.fillRect(x*s,y*s,s,s); 
       } 
      } 
      g.drawImage(image, 0, 0, null); 
     } 
    } 

} 
+1

Danke. Vielen Dank ... +1 von mir ... – user3398663

+0

Danke. Vielen Dank ... +1 von mir ... –

0

Erstellen Sie ein transparentes Bild von der gleichen Größe, die weiße Grenze ziehen und verwischen sie. Dann kopiere es über das Bild, auf dem der Farbverlaufsrand liegen soll.

Referenz: http://www.jhlabs.com/ip/blurring.html

Hoffnung, das hilft!

+0

Sie für Ihren Vorschlag danken. Ich werde es versuchen. – user3398663

Verwandte Themen