2016-06-07 21 views
0

ich ein Bild aus einer Liste von Pixel bin Anzeige wie folgt (das funktioniert):Java SWT: Teilmenge des Pixels von Bild Holen Sie sich ein neues Bild erstellen

private Image GetImage() 
{ 
    PaletteData palette=new PaletteData(0xff0000,0x00ff00,0x0000ff); 
    ImageData imageData = new ImageData(bmpHW, bmpHW,32,palette); 

    currentImagePixelVec = getPixelsFromBMP(0, 0, graphicsMemory); 
    int pixelVecLoc=0; 
    for (int h = 0; h<bmpHW; h++) 
    { 
     for (int w = 0; w<bmpHW; w++) 
     { 
      int p = 0; 
      Pixel pixel = currentImagePixelVec.get(pixelVecLoc); 
      p = (pixel.Alpha<<24) | (pixel.Red<<16) | (pixel.Green<<8) | pixel.Blue;     
      imageData.setPixel(w, h, p); 

      pixelVecLoc++; 
     } 
    } 


    imageData = imageData.scaledTo(700, 700); 
    Image image = ImageDescriptor.createFromImageData(imageData).createImage(); 
    return image; 

} 

Ich erhalte den Benutzer ein Rechteck auswählen des Bildes wie folgt (das funktioniert):

   if(drag) 
       { 
        GC gc1 = e.gc; 

        //gc.setBackground(top.getDefault().getSystemColor(SWT.COLOR_BLACK)); 
        gc1.setAlpha(128); 

        int minX = Math.min(startX, endX); 
        int minY = Math.min(startY, endY); 

        int maxX = Math.max(startX, endX); 
        int maxY = Math.max(startY, endY); 

        int width = maxX - minX; 
        int height = maxY - minY; 

        gc1.fillRectangle(minX, minY, width, height); 
       } 

ich möchte ein neues Bild von der Rechteckauswahl erstellen:

private Image GetZoomedImage() 
{      

int minX = Math.min(startX, endX); 
int minY = Math.min(startY, endY); 

int maxX = Math.max(startX, endX); 
int maxY = Math.max(startY, endY); 

int width = maxX - minX; 
int height = maxY - minY; 

    PaletteData palette=new PaletteData(0xff0000,0x00ff00,0x0000ff); 
    ImageData imageData = new ImageData(1300, 1300,32,palette); 

    int newHeight = 0; 
    int newWidth = 0; 
    for (int h = minX; h<maxX; h++) 
    { 
     for (int w = minY; w<maxY; w++) 
     {   
      int p = 0; 
      //Pixel pixel = currentImagePixelVec.get((h * w)-1); 
      int actualPix = imageDisplayed.getImageData().getPixel(h, w); 
      //p = (pixel.Alpha<<24) | (pixel.Red<<16) | (pixel.Green<<8) | pixel.Blue;  
      System.out.println("Pixel: " + Integer.toString(actualPix)); 
      //imageData.setPixel(newWidth,newHeight, p); 
      imageData.setPixel(newWidth,newHeight, actualPix); 

      newWidth++; 
     } 
     newHeight++; 
    } 


    imageData = imageData.scaledTo(700, 700); 
    Image image = ImageDescriptor.createFromImageData(imageData).createImage(); 
    return image; 

} 

Bin ich auf dem richtigen Weg?

Antwort

1

Sie sollten nur einmal die Bilddaten des bestehenden Bildes erhalten, da dies eine teuere Operation sein kann:

ImageData imageData = new ImageData(width, height, 32, palette); 
:

ImageData imageDisplayedData = imageDisplayed.getImageData(); 

Ihre neuen Bilddaten sollten nur die Breite und Höhe Sie wollen sein

können Sie die zum lesen und schreiben

public void getPixels(int x, int y, int getWidth, int[] pixels, int startIndex) 

public void setPixels(int x, int y, int putWidth, int[] pixels, int startIndex) 

Methoden der ImageData verwenden die Daten für eine ganze Reihe auf einmal:

int [] pixels = new int [width]; 

int newRow = 0; 
for (int row = minY; row < maxY; row++) 
{   
    imageDisplayedData.getPixels(minX, row, width, pixels, 0); 

    imageData.setPixels(0, newRow, width, pixels, 0); 

    newRow++; 
}