Ustawienie mieszanie kolorow bitmap

Ustawienie mieszanie kolorow bitmap
Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
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:

Kopiuj
    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:

Kopiuj
    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
wojciechmaciejewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 560
1

co to za szalona pętla?

a ten kod :

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

to przypadkiem nie robi czegoś takiego?:

Kopiuj
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

Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
0

Dziękuję za pomoc.

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

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.