Смешивание пикселей из двух растровых изображений

Я бьюсь головой о стену здесь, и я почти уверен, что делаю что-то глупое, так что пора обнародовать мою глупость.

Я пытаюсь взять два изображения, объединить их в третье изображение, используя стандартные алгоритмы смешивания (Hardlight, softlight, overlay, multiply и т. д.).

Потому что Android не поддерживает Имея такие встроенные свойства наложения, я пошел по пути, взяв каждый пиксель и комбинируя их с помощью алгоритма. Однако результаты - мусор. Ниже приведены результаты простого умножения (использованные изображения и ожидаемый результат).

ОСНОВА: alt text

СМЕШИВАНИЕ: alt text

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ: alt text

РЕЗУЛЬТАТ МУСОРА: alt text

Любая помощь будет принята с благодарностью. Ниже приведен код, в котором я пытался удалить весь «мусор», но некоторые из них могли пройти. Я уберу его, если что-то непонятно.

    ImageView imageView = (ImageView) findViewById(R.id.ImageView01);
    Bitmap base = BitmapFactory.decodeResource(getResources(), R.drawable.base);
    Bitmap result = base.copy(Bitmap.Config.RGB_565, true);
    Bitmap blend = BitmapFactory.decodeResource(getResources(), R.drawable.blend);

    IntBuffer buffBase = IntBuffer.allocate(base.getWidth() * base.getHeight());
    base.copyPixelsToBuffer(buffBase);
    buffBase.rewind();

    IntBuffer buffBlend = IntBuffer.allocate(blend.getWidth() * blend.getHeight());
    blend.copyPixelsToBuffer(buffBlend);
    buffBlend.rewind();

    IntBuffer buffOut = IntBuffer.allocate(base.getWidth() * base.getHeight());
    buffOut.rewind();

    while (buffOut.position() < buffOut.limit()) {
        int filterInt = buffBlend.get();
        int srcInt = buffBase.get();

        int redValueFilter = Color.red(filterInt);
        int greenValueFilter = Color.green(filterInt);
        int blueValueFilter = Color.blue(filterInt);

        int redValueSrc = Color.red(srcInt);
        int greenValueSrc = Color.green(srcInt);
        int blueValueSrc = Color.blue(srcInt);

        int redValueFinal = multiply(redValueFilter, redValueSrc);
        int greenValueFinal = multiply(greenValueFilter, greenValueSrc);
        int blueValueFinal = multiply(blueValueFilter, blueValueSrc);

        int pixel = Color.argb(255, redValueFinal, greenValueFinal, blueValueFinal);

        buffOut.put(pixel);
    }

    buffOut.rewind();

    result.copyPixelsFromBuffer(buffOut);   

    BitmapDrawable drawable = new BitmapDrawable(getResources(), result);
    imageView.setImageDrawable(drawable);
}

int multiply(int in1, int in2) {
    return in1 * in2 / 255;
}
15
задан MarkPowell 6 January 2011 в 16:46
поделиться