2012-03-29 9 views
0

Ich habe ein kleines Problem, ich habe einen Code, der alle Pixel liest und die RGB-Farbe des Pixels nimmt. Aber zuvor habe ich das Bild in Stücke geschnitten, damit ich auch größere Bilder berechnen kann, ohne den Speicher zu überschreiten. Hier ist der Code:Get x, y Position eines bestimmten Pixels

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 

      try { 
       decoder_image = BitmapRegionDecoder.newInstance(filePath, 
         false); 


      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       boolean bool_pixel = true; 
       final int width = decoder_image.getWidth(); 
       final int height = decoder_image.getHeight(); 
       // Divide the bitmap into 1100x1100 sized chunks and process it. 
       // This makes sure that the app will not be "overloaded" 
       int wSteps = (int) Math.ceil(width/1100.0); 
       int hSteps = (int) Math.ceil(height/1100.0); 
       Rect rect = new Rect(); 
       for (int h = 0; h < hSteps; h++) { 
        for (int w = 0; w < wSteps; w++) { 
         int w2 = Math.min(width, (w + 1) * 1100); 
         int h2 = Math.min(height, (h + 1) * 1100); 
         rect.set(w * 1100, h * 1100, w2, h2); 
         bitmap_image = decoder_image.decodeRegion(rect, 
           null); 

         try { 
          int bWidth = bitmap_image.getWidth(); 
          int bHeight = bitmap_image.getHeight(); 
          int[] pixels = new int[bWidth * bHeight]; 
          bitmap_image.getPixels(pixels, 0, bWidth, 0, 0, 
            bWidth, bHeight); 
          for (int y = 0; y < bHeight; y++) { 
           for (int x = 0; x < bWidth; x++) { 

            int index = y * bWidth + x; 
            int R = (pixels[index] >> 16) & 0xff; //bitwise shifting 
            int G = (pixels[index] >> 8) & 0xff; 
            int B = pixels[index] & 0xff; 
            total++; 

            if (R == 255){ 
            //Save x,y position          
            } 
            if ((G > (R+2)) && (G > (B+2))) { 
            counter++; 
            } 
           } 
          } 
         } finally { 
          bitmap_image.recycle(); 
         } 
        } 
       } 
      } finally { 
       decoder_image.recycle();      
      } 

Dies funktioniert wie ein Charme. Hatte einige Informationen aus dem Internet, und ich habe dies für meinen eigenen Code neu gemacht.

Aber was will ich jetzt, das heißt: wenn er einen "vollen" roten Pixel (255) erkennt, muss er die x, y Position dieses Pixels anzeigen.

Ich dachte, das war sehr einfach zu machen, aber weil ich das Bild in Chucks geschnitten habe, bekomme ich sehr seltsame x, y Positionen (was ich denke).

Ich werde schnell erklären, warum ich das will: Im Bild sind es 2 rote Pixel, und diese 2 müssen in ein Rechteck umgewandelt werden, aber ich bekomme nicht die guten x, y Positionen.

So um die Frage zu klären: Wie bekomme ich die x, y-Position des roten Pixels.

Vielleicht sehr einfach, aber irgendwie bekomme ich einfach nicht den richtigen Ort, nicht einmal in der Nähe. Ich überprüfe das, indem ich das Bild in Photoshop öffne und schaue, was das x, y des roten Pixels ist, aber meine App gibt sehr seltsame Koordinaten.

Wenn Sie weitere Informationen oder etwas anderes benötigen, bitte Kommentar.

Danke schon, Bigflow

+0

Also müssen Sie einen Algorithmus erstellen, der die Pixelposition berechnet? – Th0rndike

+0

Jacks Antwort war korrekt – Bigflow

Antwort

1

Coords sollte rect.left + x und rect.top + y werden. Hast du das schon probiert?

+0

Arbeitete perfekt, danke. – Bigflow

0

x und y sind horizontale und vertikale Pixelposition im Bild durch eigene, globale Koordinaten hängen vom Ursprung des Koordinatensystems ab, das Sie respektieren und wie das Bild entsprechend verschoben wird.