Sto battendo la testa contro un muro qui, e sono abbastanza certo che sto facendo qualcosa di stupido, quindi è tempo di rendere pubblica la mia stupidità.Blending pixels from Two Bitmaps
Sto provando a scattare due immagini, unendole in una terza immagine utilizzando gli algoritmi di fusione standard (Hardlight, softlight, sovrapposizione, moltiplicazione, ecc.).
Poiché Android non dispone di tali proprietà di fusione incorporate, ho seguito il percorso di prendere ogni pixel e combinarli utilizzando un algoritmo. Tuttavia, i risultati sono spazzatura. Di seguito sono riportati i risultati di una semplice miscela multipla (immagini utilizzate e risultati attesi).
BASE:
MISCELA: RESULT
PREVISTO:
IMMONDIZIA RESULT:
Tutto l'aiuto sarebbe apprezzato. Di seguito è riportato il codice, che ho cercato di eliminare tutti i "junk", ma alcuni potrebbero averlo superato. Lo pulirò se qualcosa non è chiaro.
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, grazie per l'aiuto. Non utilizzo le immagini con trasparenza, quindi l'opacità sarebbe sempre 1. Ho aggiornato l'esempio con le immagini e pulito il codice. – MarkPowell
Hmm grazie per le immagini - questo è davvero un risultato spazzatura. Al momento non ho accesso ad un ambiente di sviluppo Android, ma mi chiedo se non abbia qualcosa a che fare con la densità dei pixel delle Bitmap: sembra che le tue Bitmap utilizzino lo spazio colore RGB565, ma sembra dai documenti che Color funziona nello spazio ARGB4444. Non ho analizzato tutti i documenti Bitmap/Color per vedere come/se questa conversione viene gestita automaticamente, ma potrebbe valere la pena di essere verificata fino a quando non posso eseguire alcuni test sulla piattaforma effettiva. –
OK, ho giocato un po 'con esso e sono riuscito a riprodurre il risultato della "spazzatura", e l'ho fatto funzionare in due modi diversi.Cercherò di cambiare la mia risposta originale per riflettere questo. –