Android: Как изменить альфа пикселя файла изображения? - PullRequest
0 голосов
/ 20 апреля 2020

Я новичок в Android программировании приложений. Мне нужно немного обработать изображение для проекта, над которым я работаю. Это приложение для шифрования изображений (вот как будет выглядеть зашифрованное изображение: пример ).

На данный момент я просто пытаюсь изменить один пиксель определенного изображения.

Я хочу изменить цвет и альфа этого пикселя. У меня проблемы с изменением альфа.

Вот мой код:

void imageProcessing() {

    // Creation of a "bitmap" object containing the pixels from "parrot.jpeg"

    BitmapFactory bf1 = new BitmapFactory();
    BitmapFactory.Options bfo1 = new BitmapFactory.Options();

    bfo1.inMutable = true;
    bfo1.inPreferredConfig = ARGB_8888;
    bfo1.outConfig = ARGB_8888;

    Bitmap bm1 = bf1.decodeFile("/storage/emulated/0/DCIM/parrot.jpeg", bfo1);

    // Recording the image with the png format, as "parrot.png"

    ByteArrayOutputStream outStream = new ByteArrayOutputStream();

    bm1.compress(Bitmap.CompressFormat.PNG, 100, outStream);

    File f = new File("/storage/emulated/0/DCIM/parrot.png");

    try {
        f.createNewFile();
        FileOutputStream fo = new FileOutputStream(f);
        fo.write(outStream.toByteArray());
        fo.flush();
        fo.close();
    } catch (FileNotFoundException e) {
        Log.w("TAG", "Error saving image file: " + e.getMessage());
    } catch (IOException e) {
        Log.w("TAG", "Error saving image file: " + e.getMessage());
    }

    // Creation of a "bitmap" object containing the pixels from "parrot.png"

    BitmapFactory bf2 = new BitmapFactory();
    BitmapFactory.Options bfo2 = new BitmapFactory.Options();

    bfo2.inMutable = true;
    bfo2.inPreferredConfig = ARGB_8888;
    bfo2.outConfig = ARGB_8888;

    Bitmap bm2 = bf2.decodeFile("/storage/emulated/0/DCIM/parrot.png", bfo2);

    // The 32 bits int which will contain values of red, green, blue, alpha
    int pixel_color;

    // The alpha, red, green, blue values
    int alpha, red, green, blue;

    // Color selected : full blue, with an alpha of 127 (the pixel will be half-transparent)
    red = 0; green = 0; blue = 255; alpha = 127;

    // Putting the A, R, G, B values into the int variable "pixel_color"
    pixel_color = (alpha<<24) | (red<<16) | (green<<8) | blue;

    // Modifying the (x=3,y=0) pixel with this color
    bm2.setPixel(3, 0, pixel_color);

    // Recording the modified image as "new_parrot.png"

    ByteArrayOutputStream outStream2 = new ByteArrayOutputStream();

    bm2.compress(Bitmap.CompressFormat.PNG, 100, outStream2);

    File f2 = new File("/storage/emulated/0/DCIM/new_parrot.png");

    try {
        f2.createNewFile();
        FileOutputStream fo = new FileOutputStream(f2);
        fo.write(outStream2.toByteArray());
        fo.flush();
        fo.close();
    } catch (FileNotFoundException e) {
        Log.w("TAG", "Error saving image file: " + e.getMessage());
    } catch (IOException e) {
        Log.w("TAG", "Error saving image file: " + e.getMessage());
    }

У меня есть 2 замечания, чтобы добавить:

1) Если я использую непосредственно изображение PNG с прозрачность (вместо запуска с изображения в формате JPEG), это работает: цвет и альфа изменяются. Однако я хочу, чтобы мое приложение работало с любым изображением. Итак, если я выберу jpeg, из этого jpeg должен быть создан png, а затем цвет пикселей и альфа могут быть изменены. Именно этот процесс не работает.

2) Код, который вы читаете, работает до записи растрового объекта "bm2" в файл png. Я использовал отладчик и наблюдал растровое изображение в Android Studio: измененный пиксель на растровом объекте действительно синий, с альфа-значением 127. Однако при записи его в файл изображения png альфа кажется потерянной, и пиксель синий и непрозрачный на полученном изображении.

Кто-нибудь из вас имеет представление о том, что я сделал не так?

Заранее спасибо.

...