Ustawienie mieszanie kolorow bitmap

0

Witam
W jaki sposób można zmieszać kolory dwóch bitmap tak żeby:

  1. Końcowa bitmapa miała kanał alpha taki jak pierwsza
  2. Kolor (rbg) był równy połączeniu kolorów dwóch bitmap z według kanału alpha?

Poniższy kod realizuje 2 punkt:

    private Bitmap Blend(Bitmap Src_01, Bitmap Src_02, int Alpha){

        Bitmap Result = Bitmap.createBitmap(Src_01.getWidth(), Src_01.getHeight(), Bitmap.Config.ARGB_8888);

        Canvas newCanvas = new Canvas(Result);

        newCanvas.drawBitmap(Src_01, 0, 0, null);

        Paint paint = new Paint();

        paint.setAlpha(Alpha);

        if (Src_01.getWidth() != Src_02.getWidth() || Src_01.getHeight() != Src_02.getHeight()){

            Bitmap Src_03 = Bitmap.createScaledBitmap(Src_02, Src_01.getWidth(), Src_01.getHeight(), false);
            newCanvas.drawBitmap(Src_03, 0, 0, paint);

        }else {

            newCanvas.drawBitmap(Src_02, 0, 0, paint);

        }

        return Result;

    }

Poniższy kod powinien realizować oba punkty, jednak efekt jest zupełni inny niż oczekiwany:

    private Bitmap BlendV2(Bitmap Src_01, Bitmap Src_02, int Alpha) {

        Bitmap Result = Bitmap.createBitmap(Src_01.getWidth(), Src_01.getHeight(), Bitmap.Config.ARGB_8888);
        Bitmap Src_03 = Bitmap.createBitmap(Src_02.getWidth(), Src_02.getHeight(), Bitmap.Config.ARGB_8888);

        if (Src_01.getWidth() != Src_02.getWidth() || Src_01.getHeight() != Src_02.getHeight()) {

            Src_03 = Bitmap.createScaledBitmap(Src_02, Src_01.getWidth(), Src_01.getHeight(), false);

        }

        Canvas canvas = new Canvas(Result);
        canvas.drawBitmap(Src_01, 0, 0, null);

        canvas.setBitmap(Src_03);
        canvas.drawBitmap(Src_02, 0, 0, null);

        for (int TB_01 = 0; TB_01 < Src_01.getWidth(); ++TB_01){

            for (int TB_02 = 0; TB_02 < Src_01.getHeight(); ++TB_02) {

                int Color_01 = Result.getPixel(TB_01, TB_02);
                int ColorAlpha_01 = Color_01 / (256*256*256);
                int ColorRGB_01 = Color_01 - ColorAlpha_01 * 256 * 256 * 256;

                int Color_02 = Src_03.getPixel(TB_01, TB_02);
                int ColorAlpha_02 = Color_02 / (256*256*256);
                int ColorRGB_02 = Color_02 - ColorAlpha_02 * 256 * 256 * 256;

                int ColorRGB_03 = (ColorRGB_01 + ColorRGB_02 * Alpha / 256) / 2;
                int Color_03 = ColorAlpha_01 * 256*256*256 + ColorRGB_03;

                Result.setPixel(TB_01, TB_02, Color_03);

            }

        }

        return Result;

    }

Dlaczego drugi kod nie działa tak jak powinien?

  1. Kod: user image
    user image
  2. Kod: user image
1

co to za szalona pętla?

a ten kod :

     int ColorAlpha_01 = Color_01 / (256*256*256);
     int ColorRGB_01 = Color_01 - ColorAlpha_01 * 256 * 256 * 256;

to przypadkiem nie robi czegoś takiego?:

int a=b/c;

int d=b-a*c // tutaj uwaga a*c jest równe .... b :D czyli w wyniku tego dostajesz 0. 

to że nie jest zero wynika najprawdopodobniej z rzutowania na dubla. Szczerze powiem nie jestem specem od grafiki ale podejrzewam że istnieje dużo lepszy sposób na takie tego narysowanie. Przy okazji nie możesz po prostu na tle narysować obrazka z taką alfą jaka Ci się podoba ?

tutaj masz coś co Ci może pomóc
http://stackoverflow.com/questions/2534116/how-to-convert-get-rgbx-y-integer-pixel-to-colorr-g-b-a-in-java

i ustaw sobie alphę na ten sam poziom i z tego stwórz nowy kolor a nie kombinuj z tym mnożeniem :)

a tu masz pełen przykład jak to dobrze zrobić.
http://stackoverflow.com/questions/11740362/merge-two-bitmaps-in-android
powodzenia

0

Dziękuję za pomoc.

Jednak z jedną rzeczą muszę się nie zgodzić:

int a=b/c;
 
int d=b-a*c // tutaj uwaga a*c jest równe .... b :D czyli w wyniku tego dostajesz 0.

int/int = int, czyli b-a*c zwróci resztę z dzielenia b/c, a nie 0.

0 użytkowników online, w tym zalogowanych: 0, gości: 0