2012-01-24 1 views
0

Я пытаюсь изменить альфа-значение растрового изображения на пиксель в цикле for. Битовая карта создается из createBitmap (источник, 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:

Хорошо это результат я придумал, если кто-то хочет взять растровое изображение и исчезать в радиальном направлении. Но да, это ОЧЕНЬ МЕДЛЕННО без массивов ... Спасибо Рувим за шагом в правильном направлении

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()' return? –

ответ

1

Версии Bitmap.createBitmap() вы используете возвращаешь непреложных растровыми. Bitmap.setPixel() не будет иметь никакого эффекта.

setPixel ужасно медленный в любом случае. Стремитесь использовать setPixels(), или, лучше всего, найти лучший способ, чем напрямую манипулировать растровыми пикселями. Я ожидаю, что вы сможете сделать что-то умное с отдельной растровой картиной только альфа-версии и right PorterDuff mode.

+0

Спасибо, что дайте попробовать и опубликуйте, что работает. Установка пикселя действительно работает, зеленый показывает только не альфа-значения – Metre

Смежные вопросы