Tutaj biję głową o ścianę i jestem prawie pewna, że robię coś głupiego, więc mam czas, aby upublicznić moją głupotę.Mieszanie pikseli z dwóch bitmap
Próbuję zrobić dwa obrazy, połączyć je w trzeci obraz przy użyciu standardowych algorytmów mieszania (Hardlight, softlight, overlay, mnożenie itp.).
Ponieważ Android nie ma wbudowanych takich właściwości mieszania, przeszedłem ścieżką robienia każdego piksela i łączenia ich za pomocą algorytmu. Jednak wyniki są śmieci. Poniżej przedstawiono wyniki prostego mieszania wielokrotnego (użyte obrazy i oczekiwany wynik).
BASE:
BLEND:
Oczekiwane WYNIK:
ŚMIECI WYNIK:
Każda pomoc będzie mile widziane. Poniżej znajduje się kod, który próbowałem usunąć z "wszystkich śmieci", ale niektóre mogły się przedostać. Sprzątnę, jeśli coś nie jest jasne.
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;
}
Kevin, dzięki za pomoc. Nie używam obrazów z przezroczystością, więc nieprzezroczystość zawsze będzie 1. Zaktualizowałem przykład obrazami i wyczyściłem kod. – MarkPowell
Hmm dzięki za zdjęcia - to naprawdę jest wynik śmieci. W tej chwili nie mam dostępu do środowiska programisty Androida, ale zastanawiam się, czy nie ma to nic wspólnego z gęstością pikseli map bitowych - wygląda na to, że Twoje mapy bitowe używają przestrzeni barw RGB565, ale to wydaje się z dokumentów, że Color działa w przestrzeni ARGB4444. Nie przeanalizowałem wszystkich dokumentów Bitmap/Colour, aby zobaczyć, jak/jeśli ta konwersja jest obsługiwana automatycznie, ale warto ją sprawdzić, dopóki nie będę mógł przeprowadzić testów na rzeczywistej platformie. –
W porządku, trochę się z tym bawiłem i udało mi się odtworzyć wynik "śmieci" i udało mi się to na dwa różne sposoby.Spróbuję zmienić oryginalną odpowiedź, aby to odzwierciedlić. –