PorterDuffXfermode無法合成圖片
阿新 • • 發佈:2019-02-14
網上好多,關於PorterDuffXfermode合成的講解,然後我自己試著做,怎麼也無法合成,百思不得其解。
原因在於,PorterDuffXfermode合成操作的是兩個bitmap,如果在一個bitmap中畫兩張圖,合成的結果可能會和預想的不一樣,是無法正常合成的,我之前犯的就是這樣的錯。
想要正常合成必須要用兩個bitmap來操作,如果我想用我畫的一個圓和一張圖片做合成怎麼辦呢?
protected void onDraw(Canvas canvas) { bitmapDis = BitmapFactory.decodeResource(context.getResources(), R.drawable.a3); bitmap = Bitmap.createBitmap(bitmapDis.getWidth(), bitmapDis.getHeight(), bitmapDis.getConfig()); mCanvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setColor(Color.RED); mCanvas.drawCircle(100, 250, 90, paint); //畫dst圖片 canvas.drawBitmap(bitmapDis, x, y, mPaint); porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN); mPaint.setXfermode(porterDuffXfermode); canvas.drawBitmap(bitmap, x, y, mPaint); }
此方法把圓也畫在了一個bitmap中,所以就可以正常合成了,注意src bitmap尺寸大於等於dst bitmap,如果src的尺寸小於dst的尺寸,dst有一部分的影象是無法被擦掉的,就是會殘留下來。
另外Src為源影象,意為將要繪製的影象;Dis為目標影象,意為我們將要把源影象繪製到的影象,簡單的可以理解成先draw的叫做dst,後draw的叫做src。
如果你在同一個bitmap中畫,無法正常合成。
猜測原因是,做影象合成的時候,先畫了一個bitmap,如果後面畫的也是一個bitmap,而且src bitmap尺寸大於等於dst bitmap,就會做正常合成操作,因為bitmap存放著圖片的畫素資訊,有了兩個bitmap,canvas就可以獲取到兩個bitmap中的畫素做合成了。
如果後面直接呼叫了canvas的drawXXX方法,意思是直接畫到螢幕上,雖然也是可以合成的,但是看不出來效果,兩個圖形沒有交集的部分仍會顯示出來,因為你是直接畫到了螢幕上,沒有把他們放到bitmap中。
另外一定要注意
mPaint.setXfermode(porterDuffXfermode);
的擺放位置,不同的位置有不同的效果。如果是這種方式:
<pre code_snippet_id="1912456" snippet_file_name="blog_20161004_1_4128575" name="code" class="java">porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN); mPaint.setXfermode(porterDuffXfermode);
<pre code_snippet_id="1912456" snippet_file_name="blog_20161004_1_4128575" name="code" class="java">canvas.drawBitmap(bitmapDis, x, y, mPaint);
canvas.drawBitmap(bitmap, x, y, mPaint);
效果是白色背景先與bitmapDis做DST_IN混合,然後bitmapDis再和bitmap做DST_IN混合。