2016-07-25 10 views
0

Hier ist mein Code:Java Bitmap Farbton ändern

public static Bitmap processing(Bitmap src, float hue) { 
     int width = src.getWidth(); 
     int height = src.getHeight(); 
     Bitmap bitmap = Bitmap.createBitmap(width, height, src.getConfig()); 
     for(int x = 0; x < width; x++) { 
      for (int y = 0; y < height; y++) { 
       int newPixel = hueChange(src.getPixel(x, y), hue); 
       bitmap.setPixel(x, y, newPixel); 
      } 
     } 
     return bitmap; 
    } 
    private static int hueChange(int startpixel, float hue) { 
     float[] hsv = new float[3];  //array to store HSV values 
     Color.colorToHSV(startpixel,hsv); //get original HSV values of pixel 
     hsv[0]=hsv[0]+hue;    //add the shift to the HUE of HSV array 
     hsv[0]=hsv[0]%360;    //confines hue to values:[0,360] 
     return Color.HSVToColor(Color.alpha(startpixel),hsv); 
    } 

Problem ist: processing nimmt bis 3300ms wenn Größe src Bitmap 480x480 ist. Und es ist zu lang für mich.


Was ist der schnellste Weg, es zu tun?


Fertig!
Der schnellste Weg ist OpenCV mit NDK zu verwenden.

+0

nicht sicher, welche Bildtransformationen Sie zu tun versuchen zu. Einige können durch das vorhandene Renderscript ScriptInstrinstics bereitgestellt werden, Sie könnten es in Renderscript schreiben oder Sie können nach OpenGL-basierten Bildverarbeitungsbibliotheken suchen. –

+0

siehe 'Bitmap # createBitmap (int [] Farben, int width, int height, Bitmap.Config config)' oder ähnliche 'Bitmap # createBitmap' Methoden – pskink

+0

kein Glück? es funktioniert nicht? Gibt eine Null zurück? eine leere 'Bitmap'? – pskink

Antwort

1

Dies ist der schlechteste Weg, dies zu tun. Wenn Sie jemals daran denken, setPixel zu verwenden, tun Sie das nicht. Du hast wahrscheinlich Unrecht.

Der richtige Weg:

Canvas canvas = new Canvas(bitmap); 
    canvas.drawColor(color); 
+1

er möchte jedes Pixel mit verschiedenen ARGB setzen – pskink

+0

Sie sind wahrscheinlich am besten in C als rohe Bytes behandeln und dann verwandelt es in eine Bitmap. Set Pixel ist einfach nicht effizient. Nicht diese Art von Arbeit in Java, dies ist eines dieser Dinge, wo fehlende Grenzen und verschiedene Speicher Layouts in C wirklich glänzen. Oder noch besser, mit Open-Gl, so können Sie es auf der GPU –

+0

@VladimirKulyk google für 'ColorFilterGenerator' laufen – pskink