2016-07-06 8 views
-2

Ich habe einen Code, der ein Bild in eine Pixelmatrix bringt. Ich muss dieses Bild in vier Teile teilen und 4 verschiedene Bilddateien für diese Teile bekommen. Dann muss ich einige Bildbearbeitung machen und dann diese Teile wieder in einem einzigen Bild zusammenfügen. Bitte helfen Sie mir dabei. Hinweis: das Bild ist farbig und wir wollen es in 4 gleiche Teile teilen und dann als eins zurückholen. Keine Änderungen erforderlich. Hier ist der Code, um vier Matrizen von Intensitäten zu bekommen. Aber ich weiß nicht, was zu tun ist damit. Es könnte sein, dass es gar nicht nötig ist.Pixeldaten zurück in Bild in Java konvertieren

import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferByte; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

    class Optimization 
{ 
    public static void main(String[] args) throws IOException 
    { 

     BufferedImage hugeImage = ImageIO.read(new File("comp.jpg")); 
     final byte[] pixels = ((DataBufferByte) hugeImage.getRaster().getDataBuffer()).getData(); 
    int width = hugeImage.getWidth(); 
    int height = hugeImage.getHeight(); 
     if(width%2!=0) 
      width=width-1; 
     if(height%2!=0) 
     height=height-1; 
     //System.out.print(width+" "+height); 
    int intensity[][]=new int[width][height]; 
    int b1[][]=new int[width/2][height/2]; 
    int b2[][]=new int[width/2][height/2]; 
    int b3[][]=new int[width/2][height/2]; 
    int b4[][]=new int[width/2][height/2]; 
    int x1=0,y1=0,x2=0,y2=0,x3=0,x4=0,y3=0,y4=0; 
     final int pixelLength = 3; 
     for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) 
      { 
      int a1,a2,a3; 
      a3= ((int) pixels[pixel] & 0xff); // blue 
      a2= (((int) pixels[pixel + 1] & 0xff)); // green 
      a1= (((int) pixels[pixel + 2] & 0xff)); // red 
      int i=(a1+a2+a3)/3; 
      intensity[col][row]=i; 
      if((col<=width/2-1)&&(row<=height/2-1)) 
      { 
       b1[x1][y1]=i; 
       x1++; 
       if(col==width/2-1) 
       { 
        x1=0; 
        y1++; 
       } 
      } 
      if((col<width)&&(row<=height/2-1)&&(col>width/2-1)) 
      { 
       b2[x2][y2]=i; 
       x2++; 
       if(col==width-1) 
       { 
        x2=0; 
        y2++; 
       } 
      } 
      if((col<width/2)&&(row<height)&&(row>=height/2)) 
      { 
       b3[x3][y3]=i; 
       x3++; 
       if(col==width/2-1) 
       { 
        x3=0; 
        y3++; 
       } 
      } 
      if((col>width/2-1)&&(row>height/2-1)) 
      { 
       b4[x4][y4]=i; 
       x4++; 
       if(col==width-1) 
       { 
        x4=0; 
        y4++; 
       } 
      } 
      col++; 
      if (col == width) 
      { 
       col = 0; 
       row++; 

      } 

    } 
    for(int m=0;m<height/2;m++) 
    { 
     for(int n=0;n<width/2;n++) 
     { 
      System.out.print(b1[n][m]+" "); 
     } 
     System.out.println(); 
    } 



    } 
} 
+0

Entschuldigung, es ist nicht klar, was Sie versuchen zu tun. Bitte zeigen Sie einige Beispiele. –

+0

Ich möchte nur ein Bild in vier Teile teilen. Das ist es. – Srijan

+1

Funktioniert Ihr Code? Scheitert es? Hast du es in deinem Debugger durchgegangen, um zu sehen, wo es von dem abweicht, was du erwartest? Wenn es fehlschlägt, was ist das falsche Verhalten? Gibt es eine Ausnahme? Wenn ja, zeigen Sie uns den Stack-Trace und teilen Sie uns mit, wo in Ihrem Code die Exception entsteht. Sie müssen uns helfen, Ihnen zu helfen. –

Antwort

0

java.awt.Image liefert Ihnen getSubimage(int x, int y, int w, int h)

"ein Unter-Bild um einen bestimmten rechteckigen Bereich definiert zurück." Sie geben einfach vier gleiche Regionen zurück und das ist es.

+0

Das ist in der Tat ein guter Weg. Aber was ist, wenn ich diese Teile des Unterbildes nach der Verarbeitung wieder zusammenfügen möchte? – Srijan

+0

@Srijan Dann erwähnen Sie es in Ihrer Frage. – eldo

0

Sie können getSubImage(int x, int y, int w, int h) verwenden, aber Sie erhalten ein Bild, das dasselbe Raster wie das ursprüngliche Bild hat. Wenn Sie also das neue Teilbild ändern, ändern Sie auch das ursprüngliche Bild. Wenn es für Sie nicht problematisch ist, dann verwenden Sie es.

Else, wie Sie bereits die Databuffer (gute Idee) zugegriffen haben, ist hier ein einfacher Code zu tun, was Sie wollen (I Databuffer Kopien machen einfach, und es funktioniert, wenn die Bildabmessungen sind ungerade):

BufferedImage image = ... ; 
BufferedImage q1 = new BufferedImage(image.getWidth()/2, image.getHeight()/2, image.getType()) ; 
BufferedImage q2 = new BufferedImage(image.getWidth()-image.getWidth()/2, image.getHeight()/2, image.getType()) ; 
BufferedImage q3 = new BufferedImage(image.getWidth()/2, image.getHeight()-image.getHeight()/2, image.getType()) ; 
BufferedImage q4 = new BufferedImage(image.getWidth()-image.getWidth()/2, image.getHeight()-image.getHeight()/2, image.getType()) ; 
byte[] bb = ((DataBufferByte)image.getRaster().getDataBuffer()).getData() ; 
byte[] bbq1 = ((DataBufferByte)q1.getRaster().getDataBuffer()).getData() ; 
byte[] bbq2 = ((DataBufferByte)q2.getRaster().getDataBuffer()).getData() ; 
byte[] bbq3 = ((DataBufferByte)q3.getRaster().getDataBuffer()).getData() ; 
byte[] bbq4 = ((DataBufferByte)q4.getRaster().getDataBuffer()).getData() ; 

for (int y=0 ; y < q1.getHeight() ; y++) // Fill Q1 and Q2 
    { 
    System.arraycopy(bb, y*image.getWidth(), bbq1, y*q1.getWidth(), q1.getWidth()) ; 
    System.arraycopy(bb, y*image.getWidth()+q1.getWidth(), bbq2, y*q2.getWidth(), q2.getWidth()) ; 
    } 

for (int y=0 ; y < q3.getHeight() ; y++) // Fill Q3 and Q4 
    { 
    System.arraycopy(bb, (y+q1.getHeight())*image.getWidth(), bbq3, y*q3.getWidth(), q3.getWidth()) ; 
    System.arraycopy(bb, (y+q1.getHeight())*image.getWidth()+q3.getWidth(), bbq4, y*q4.getWidth(), q4.getWidth()) ; 
    } 
+0

Das ist überwältigende Logik, um separate Byte-Arrays zu erstellen, die das Originalbild nicht beeinflussen. – Srijan

+0

Können Sie mir bitte sagen, wie Sie nach einer Bildverarbeitung alle Bildteile wieder zusammenfügen können? – Srijan

+0

Sie tun genau das Gegenteil von dem Code, den ich geteilt habe. Sie erstellen ein großes Bild, das der Summe der vier Bilder entspricht, und fügen dann eine Zeile/Zeile von Q1 gefolgt von einer Zeile/Zeile von Q2 hinzu, bis Q1/Q2 vollständig kopiert sind. Dann fängst du an, Q3/Q4 auf die gleiche Weise hinzuzufügen. – FiReTiTi