Ich hämmere hier gegen eine Wand und ich bin ziemlich sicher, dass ich etwas Dummes mache, also Zeit, meine Dummheit öffentlich zu machen.Pixel aus zwei Bitmaps mischen
Ich versuche, zwei Bilder zu machen, mische sie zu einem dritten Bild mit Standard-Mischalgorithmen (Hardlight, Softlight, Overlay, Multiplizieren, etc).
Da Android solche Blend-Eigenschaften nicht integriert hat, habe ich den Pfad der einzelnen Pixel genommen und sie mit einem Algorithmus kombiniert. Die Ergebnisse sind jedoch Müll. Im Folgenden finden Sie die Ergebnisse einer einfachen Multiplikation (verwendete Bilder und erwartetes Ergebnis).
BASE:
BLEND:
Erwartetes Ergebnis:
ABFALL ERGEBNIS:
Jede Hilfe würde geschätzt. Unten ist der Code, den ich versucht habe, den ganzen "Müll" zu entfernen, aber einige haben es vielleicht geschafft. Ich werde es aufräumen, wenn etwas nicht klar ist.
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, danke für die Hilfe. Ich verwende keine Bilder mit Transparenz, daher ist die Deckkraft immer 1. Ich habe das Beispiel mit Bildern aktualisiert und den Code aufgeräumt. – MarkPowell
Hmm danke für die Bilder - das ist wirklich ein Müllresultat. Ich habe momentan keinen Zugang zu einer Android-Entwicklungsumgebung, aber ich frage mich, ob es etwas mit der Pixeldichte der Bitmaps zu tun hat - es sieht so aus, als ob deine Bitmaps RGB565-Farbraum benutzen, aber es ist scheint aus der Dokumentation, die Farbe in ARGB4444 Raum arbeitet. Ich habe nicht alle Bitmap-/Farbdokumente analysiert, um zu sehen, wie/wenn diese Konvertierung automatisch durchgeführt wird, aber es könnte sich lohnen, sie auszuprobieren, bis ich einige Tests auf der tatsächlichen Plattform durchführen kann. –
Okay, ich habe ein bisschen damit gespielt, und ich war in der Lage, Ihr "Müll" -Ergebnis zu reproduzieren, und ich habe es auf zwei verschiedene Arten arbeiten lassen.Ich werde versuchen, meine ursprüngliche Antwort zu ändern, um dies zu reflektieren. –