3

上記の各フィールドのシークバーを調整することで、画像の色相、彩度、明るさ、コントラスト、シャープネスを調整できるアプリを作成しようとしています。http://ronbigelow.com/articles/workflow_basic/hue-saturation_tool.jpgのように

これを行う方法がわかりません。オンラインでチュートリアルが見つかりません。Android には、これを行うものは既にありますか? 個々のピクセルの色を操作する必要がありますか? ピクセルをいじる必要がある場合、どうすればよいですか?

4

1 に答える 1

4

はい、アンドロイドには色を操作するためのツールがいくつかありますが、他のツールよりも簡単なものもあります。すべての画像の一般的なスペースを具体的に求めていることを行う唯一の方法は、個々のピクセルを変更することです。はるかに高速ですが、正確さははるかに劣ります (ColorFilter)。

色相チェンジャー:

private Bitmap adjustedHue(Bitmap o, int deg)
{
   Bitmap srca = o;
   Bitmap bitmap = srca.copy(Bitmap.Config.ARGB_8888, true);
   for(int x = 0;x < bitmap.getWidth();x++)
       for(int y = 0;y < bitmap.getHeight();y++){
               int newPixel = hueChange(bitmap.getPixel(x,y),deg);
               bitmap.setPixel(x, y, newPixel);
       }

   return bitmap;
}
private int hueChange(int startpixel,int deg){
   float[] hsv = new float[3];       //array to store HSV values
   Color.colorToHSV(startpixel,hsv); //get original HSV values of pixel
   hsv[0]=hsv[0]+deg;                //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);
}

ここから、彩度/明るさは些細なことです。しかし、これはすべてあなたが望むものを手に入れますが、ちょっと遅いです. getPixel() 関数は特に強力です。これらをリアルタイムで変更する場合は、最初にピクセルを「キャッシュ」することをお勧めします。たとえば、HUE、SATURATION、VALUE、ALPHA のすべての値を最初に 2 次元配列として格納し、小さな変更ごとに getPixel() と Color.colorToHSV() を呼び出すのではなく、THEM を呼び出すと、コードが大幅に高速化されます。

また、bitmap.getPixels() 関数のほうがずっとうまく機能しました。最初に生成された配列を保存してから、それを反復処理できます。

さて、同様のピクセル固有の方法を使用して明るさ/コントラストを実行できますが(Vに値を掛けて、オフセットを追加します)...シャープネスはそれほど単純ではありません。シャープネスは、独立した色ベースの変更ではなく、画像自体に対する変更です (「コンボリューション」と呼ばれます)。つまり、変換が機能するには、隣接するピクセルについて何かを知る必要があります。このための組み込みのアンドロイド機能を知りません。しかし、それはいくつかの方法で行うことができます。

「シャープ」機能が必要な場合は、まず「ぼかし」機能を試してみます。これは同様のプロセスですが、より直感的 (かつクール) です。また、ぼかしを使用して実際に画像をシャープにすることもできます。この男は、これらすべてを Java で使用するために (ソース/アプレットを使用して) 説明するのに非常に優れています。

http://www.jhlabs.com/ip/blurring.html

于 2011-06-26T07:30:07.800 に答える