2012-01-24 1 views
0

forループのピクセルごとにビットマップのアルファ値を変更しようとしています。ビットマップは、別のビットマップのcreateBitmap(source、x、y、w、h)から作成されます。私は少しテストを行ったが、私はアルファを変更するように見えることはできません。それはsetPixelコマンドですか、それともARGBではないビットマップですか?Android - ピクセルごとのアルファを変更する

最後にシンプルなフェードアウトエフェクトを作成したいと思いますが、今のところ私はハーフアルファを使って元のピクセルカラーを参照していません。おかげであなたは:)

 _left[1] = Bitmap.createBitmap(TestActivity.photo, 0, 0, 256, 256); 


     for (int i = 0; i < _left[1].getWidth(); i++) 
      for (int t = 0; t < _left[1].getHeight(); t++) { 

       int a = (_left[1].getWidth()/2) - i; 
       int b = (_left[1].getHeight()/2) - t; 
       double dist = Math.sqrt((a*a) + (b*b)); 

       if (dist > 20) _left[1].setPixel(i, t, Color.argb(128, 0, 255, 0)); 

      } 

がUPDATE助けることができる場合:

オーケー、これは誰もがビットマップを取り、放射状にフェードアウトしたい場合は、私が思いついた結果です。しかし、はい、それはあなたが返します不変ビットマップを使用しているBitmap.createBitmap()のおかげでルーベン正しい方向への第一歩

public void fadeBitmap (Bitmap input, double fadeStartPercent, double fadeEndPercent, Bitmap output) { 

    Bitmap tempalpha = Bitmap.createBitmap(input.getWidth(), input.getHeight(), Bitmap.Config.ARGB_8888); 

    Canvas printcanvas = new Canvas(output); 

    int radius = input.getWidth()/2; 
    double fadelength = (radius * (fadeEndPercent/100)); 
    double fadestart = (radius * (fadeStartPercent/100)); 

    for (int i = 0; i < input.getWidth(); i++) 
     for (int t = 0; t < input.getHeight(); t++) { 

      int a = (input.getWidth()/2) - i; 
      int b = (input.getHeight()/2) - t; 
      double dist = Math.sqrt((a*a) + (b*b)); 

      if (dist <= fadestart) { 
       tempalpha.setPixel(i,t,Color.argb(255, 255, 255, 255)); 
      } else { 
       int fadeoff = 255 - (int) ((dist - fadestart) * (255/(fadelength - fadestart))); 
       if (dist > radius * (fadeEndPercent/100)) fadeoff = 0; 
       tempalpha.setPixel(i,t,Color.argb(fadeoff, 255, 255, 255)); 
      } 

     } 

    Paint alphaP = new Paint(); 
    alphaP.setAntiAlias(true); 
    alphaP.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 

// printcanvas.setBitmap(); 
    printcanvas.drawBitmap(input, 0, 0, null); 
    printcanvas.drawBitmap(tempalpha, 0, 0, alphaP); 

} 
+0

'_left [1] .hasAlpha()は何を返しますか? –

答えて

1

のバージョン...配列せずに非常に遅いです。 Bitmap.setPixel()は効果がありません。

setPixelはとにかく遅いです。 setPixels()を使用することをお勧めします。ビットマップピクセルを直接操作するよりも良い方法を見つけることができます。別のアルファ専用ビットマップとright PorterDuff modeを使用すると、賢明なことができると思います。

+0

ありがとうございました。セットされたピクセルは機能しますが、緑色はアルファ値ではありません – Metre

関連する問題