Miscelazione di pixel da due bitmap

Sto battendo la testa contro un muro qui e sono abbastanza sicuro che sto facendo qualcosa di stupido, quindi tempo per rendere pubblico la mia stupidità.

Sto cercando di prendere due immagini, mescolarle in una terza image usando algoritmi standard di miscelazione (Hardlight, softlight, overlay, moltiplicazione, ecc.).

  • Come eseguire l'analisi dell'unità JSON analisi
  • End evento di animation android
  • Chiudere l'applicazione e rimuovere dalle applicazioni recenti /
  • Come determinare se l'utente è sullo schermo di block dal servizio
  • Come impostare il font per TextView in android?
  • Come eseguire script matlab da java (per android) utilizzando matlabcontol.jar
  • Poiché Android non ha costruzioni di tali properties; di miscelazione, sono andato giù il path per prendere each pixel e combinarli utilizzando un algorithm. Tuttavia, i risultati sono spazzatura. Di seguito sono riportti i risultati di una semplice miscela multipla (immagini utilizzate e risultato previsto).

    BASE: alt text

    MISCELA: alt text

    RISULTATO ATTESO: alt text

    RISULTATO DEL RICARICO: alt text

    Qualsiasi aiuto sarebbe apprezzato. Di seguito è il codice, che ho cercato di eliminare tutti i "junk", ma alcuni potrebbero averlo fatto. Lo ripulirò 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; } 

  • Contare il numero totale di elementi di elenco in un elencoView
  • Comunicazione tra client e server che utilizzano zoccoli
  • Come modificare la dimensione RAM dell'emulatore android dalla row di command?
  • Vista personalizzata di Android Vista perdita di memory bitmap
  • Ant use-source 7 o superiore per abilitare l'operatore di diamanti
  • Come rimuovere l'applicazione dalle inserzioni di app su Android Developer Console
  • 2 Solutions collect form web for “Miscelazione di pixel da due bitmap”

    Dopo la riproduzione, penso che il tuo problema abbia a che fare con la manipolazione delle immagini in modalità RGB565. Come discusso in questo post , Bitmaps apparentemente deve essere in modalità ARGB8888 per manipolare correttamente. Ho ottenuto il risultato previsto su una miscela moltiplicata eseguendo le seguenti operazioni:

     Resources res = getResources(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.ARGB_8888; Bitmap base = BitmapFactory.decodeResource(res, R.drawable.base, options); Bitmap blend = BitmapFactory.decodeResource(res, R.drawable.blend, options); // now base and blend are in ARGB8888 mode, which is what you want Bitmap result = base.copy(Config.ARGB_8888, true); // Continue with IntBuffers as before... 

    La conversione delle Bitmap in modalità ARGB8888 sembra funzionare per me, alless con i templates di test di gradiente. Tuttavia, è sufficiente eseguire lo schermo o la moltiplicazione, è ansible provare anche questo:

     // Same image creation/reading as above, then: Paint p = new Paint(); p.setXfermode(new PorterDuffXfermode(Mode.MULTIPLY)); p.setShader(new BitmapShader(blend, TileMode.CLAMP, TileMode.CLAMP)); Canvas c = new Canvas(); c.setBitmap(result); c.drawBitmap(base, 0, 0, null); c.drawRect(0, 0, base.getWidth(), base.getHeight(), p); 

    Con questo, non si eseguono i calcoli per pixel, ma si è limitati al Preset PorterDuff.Mode s. Nel mio veloce (e sporco) test, questo era l'unico modo in cui ho potuto get la miscelazione per lavorare su immagini non gradienti.

    Semplice sovrapposizione si può fare in questo modo (per semplicità si suppone che bmp1 sia uguale o maggiore di bmp2):

     private Bitmap bitmapOverlay(Bitmap bmp1, Bitmap bmp2) { Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig()); Canvas canvas = new Canvas(bmOverlay); canvas.drawBitmap(bmp1, 0, 0, null); canvas.drawBitmap(bmp2, 0, 0, null); return bmOverlay; } 

    Per algoritmi di miscelazione più complessi, forse puoi aiutarti con alcune funzioni Bitmap / Canvas disponibili.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.