2016-07-25 4 views
0

は、ここに私のコードです:Javaのビットマップチェンジ色相

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); 
    } 

問題は次のとおりです。processingは、srcのビットマップのサイズは480×480である場合に3300msまでかかります。それは私にとっては長すぎます。


それを行うための最速の方法は何ですか?


完了!
最も簡単な方法は、OpenCVをNDKで使用することです。

+0

わかりません。既存のRenderscript ScriptInstrinsticsによって提供されるものもあれば、Renderscriptで記述するものや、OpenGLベースの画像処理ライブラリを探すこともできます。 –

+0

'Bitmap#createBitmap(int [] colors、int width、int height、Bitmap.Config config)'または同様の 'Bitmap#createBitmap'メソッドを参照してください – pskink

+0

運がありませんか?それは動作しません? nullを返しますか?空の 'Bitmap'? – pskink

答えて

1

これはこれを行う最悪の方法です。 setPixelを使うことを考えたことがあるなら、しないでください。あなたはおそらく間違っています。

正しい方法:何をしようとする画像変換

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

彼はそれぞれのピクセルを異なるARGBに設定したい – pskink

+0

あなたは、おそらくCで生のバイトとして扱い、ビットマップに変換することをお勧めします。セットピクセルは単に効率的ではありません。 Javaでこの種の作業をしているわけではありませんが、これは境界チェックの欠如とCの異なるメモリレイアウトが本当に輝くものの1つです。または、より良い、オープンGLを使用するので、あなたはgpuでそれを実行することができます –

+0

@VladimirKulyk google for 'ColorFilterGenerator' – pskink