Более быстрый способ установить цвет (PNG) вместо пикселя за пикселем - PullRequest
1 голос
/ 23 ноября 2010

У меня есть несколько файлов PNG, к которым я применяю цвет.Цвет меняется в зависимости от выбора пользователя.Я меняю цвет с помощью 3 значений RGB, установленных другим способом.Файлы png имеют произвольную форму с полной прозрачностью вне формы.Я не хочу изменять прозрачность, только значение RGB.В настоящее время я устанавливаю значения RGB попиксельно (см. Код ниже).

Я пришел к выводу, что это невероятно медленно и, возможно, просто недостаточно эффективно, как в приложении.Есть ли лучший способ, которым я мог бы сделать это?

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

public void foo(Component component, ComponentColor compColor, int userColor) {
    int h = component.getImages().getHeight();
    int w = component.getImages().getWidth();
    mBitmap = component.getImages().createScaledBitmap(component.getImages(), w, h, true);

    int[] pixels = new int[h * w];

    //Get all the pixels from the image
    mBitmap[index].getPixels(pixels, 0, w, 0, 0, w, h);

    //Modify the pixel array to the color the user selected
    pixels = changeColor(compColor, pixels);

    //Set the image to use the new pixel array
    mBitmap[index].setPixels(pixels, 0, w, 0, 0, w, h);
}

public int[] changeColor(ComponentColor compColor, int[] pixels) {
    int red = compColor.getRed();
    int green = compColor.getGreen();
    int blue = compColor.getBlue();
    int alpha;

    for (int i=0; i < pixels.length; i++) {
        alpha = Color.alpha(pixels[i]);
        if (alpha != 0) {
            pixels[i] = Color.argb(alpha, red, green, blue);
        }
    }
    return pixels;
}

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Вы смотрели на функции, доступные в Растровое изображение ? Что-то вроде extractAlpha звучит так, как будто это может быть полезно. Вы также посмотрите, как такие функции реализованы в Android, чтобы увидеть, как вы можете адаптировать его к вашему конкретному случаю, если он не совсем соответствует вашим потребностям.

1 голос
/ 13 октября 2015

Ответ, который сработал для меня, был здесь: квадрат с надписью Прозрачные JPEG

Они предоставляют более быстрый фрагмент кода для выполнения этой задачи. Я попытался извлечь Alpha, и это не сработало, но решение Square помогло. Просто измените их решение, вместо этого измените бит цвета, а не альфа-бит.

т.е.

pixels[x] = (pixels[x] & 0xFF000000) | (color & 0x00FFFFFF);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...