2016-05-10 26 views
1

Ich muss einen Abschnitt eines bufferedImage pixelieren. Ich habe versucht, den Code von How can I pixelate a jpg with java? jedoch modifizierte dies für ein gesamtes Bild ausgebildet ist, und scheint nicht mit bestimmten Abschnitten zu arbeiten (ich einfach erhalten schwarz ein schwarzes Bild ausgegeben)Verpixeln eines Abschnitts eines gepuffertenBildes

 Raster src = bufferedImage.getData(); 
    WritableRaster dest = src.createCompatibleWritableRaster(); 
    for (int y = pixelateSection.y; y < src.getHeight(); y += PIX_SIZE) { 
     for (int x = pixelateSection.x; x < src.getWidth(); x += PIX_SIZE) { 

      double[] pixel = new double[3]; 
      pixel = src.getPixel(x, y, pixel); 

      for (int yd = y; (yd < y + PIX_SIZE) && (yd < dest.getHeight()); yd++) { 
       for (int xd = x; (xd < x + PIX_SIZE) && (xd < dest.getWidth()); xd++) { 
        dest.setPixel(xd, yd, pixel); 
       } 
      } 
     } 
    } 
    bufferedImage.setData(dest); 
    return bufferedImage; 

Erwartetes Ergebnis:

enter image description here

+0

Der Code sieht richtig. Zeige uns mehr von deinem Programm. Was sind die Anfangswerte in 'pixelateSection'? – JimmyB

+0

Probieren Sie 'dest.setRect (src);' vor der Schleife aus. – JimmyB

+0

Sie haben dies nicht einmal versucht – gpasch

Antwort

2

Es funktioniert gut. Ich habe den Code für die Teile, die nicht enthalten waren, optimiert.

Hier ist Arbeitscode.

package test; 

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import java.awt.image.Raster; 
import java.awt.image.WritableRaster; 
import java.io.File; 

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

public class TestMain { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Testing"); 
     frame.add(new TestPanel()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static class TestPanel extends JPanel { 
     int width; 
     int height; 
     String fileName = "guy fox.jpg"; 
     BufferedImage image; 
     BufferedImage pixelatedImage; 

     public final static Rectangle pixelateSection = new Rectangle(200, 150, 200, 300); 

     public static final int PIX_SIZE = 10; 


     public TestPanel() { 
      image = getImage(); 
      width = image.getWidth(); 
      height = image.getHeight(); 

      pixelatedImage = pixelateImage(image); 

     } 

     private BufferedImage pixelateImage(BufferedImage bufferedImage) { 
      Raster src = bufferedImage.getData(); 
      WritableRaster dest = src.createCompatibleWritableRaster(); 

      bufferedImage.copyData(dest); 

      for (int y = pixelateSection.y; y < pixelateSection.y + pixelateSection.getHeight(); y += PIX_SIZE) { 
       for (int x = pixelateSection.x; x < pixelateSection.x + pixelateSection.getWidth(); x += PIX_SIZE) { 

        double[] pixel = new double[3]; 
        pixel = src.getPixel(x, y, pixel); 

        for (int yd = y; (yd < y + PIX_SIZE) && (yd < dest.getHeight()); yd++) { 
         for (int xd = x; (xd < x + PIX_SIZE) && (xd < dest.getWidth()); xd++) { 
          dest.setPixel(xd, yd, pixel); 
         } 
        } 
       } 
      } 

      bufferedImage.setData(dest); 

      return bufferedImage; 
     } 

     private BufferedImage getImage() { 
      BufferedImage image = null; 
      try { 
       image = ImageIO.read(new File(fileName)); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 

      return image; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(width, height); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(image, 0, 0, this); 
     } 
    } 
} 

Eingabebild

enter image description here

Ausgangsbild

enter image description here

Verwandte Themen