Android - изменение альфа на пиксель - PullRequest
0 голосов
/ 24 января 2012

Я пытаюсь изменить альфа-значение растрового изображения на пиксель в цикле for.Растровое изображение создается из createBitmap (source, x, y, w, h) другого растрового изображения.Я сделал небольшой тест, но я не могу изменить альфа.Является ли это командой setPixel или фактом, что это не ARGB растровое изображение?

В конце я хочу создать простой эффект затухания, но сейчас я не ссылаюсь на исходные пиксельные цвета, только зеленый с половиной альфа.Спасибо, если вы можете помочь:)

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

            }

ОБНОВЛЕНИЕ:

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

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

}

1 Ответ

1 голос
/ 24 января 2012

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

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

...