我最近注意到這些例外(被發現,但登錄logcat中):在新的Android 4.4警告
W/System.err(2612): java.lang.RuntimeException: Canvas: trying to use a non-premultiplied bitmap [email protected]
W/System.err(2612): at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1088)
W/System.err(2612): at android.graphics.Canvas.<init>(Canvas.java:139)
System.err(2612): at com.example.imaging.ImageHelper.addShadow(ImageHelper.java:553)
我試圖理解這是什麼異常的手段(以及非預乘的位圖) ,但我不確定可能會導致此異常。我們從服務器獲得的圖像是否存在問題,還是我們在本地進行的? (這不只是這條線導致異常,但它是其中之一)。
僅供參考,我在這裏補充問題的方法,並強調,導致異常的一個:
public static Bitmap addShadow(Bitmap bitmap) {
try {
BlurMaskFilter blurFilter = new BlurMaskFilter(12, BlurMaskFilter.Blur.OUTER);
Paint shadowPaint = new Paint();
shadowPaint.setMaskFilter(blurFilter);
shadowPaint.setShadowLayer(12, -3, -3, Color.parseColor("#33000000"));
int[] offsetXY = new int[2];
Bitmap shadowImage = bitmap.extractAlpha(shadowPaint, offsetXY);
Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true);
Canvas c = new Canvas(shadowImage32); // exception occurs here <----
c.drawBitmap(bitmap, -offsetXY[0], -offsetXY[1], null);
return shadowImage32;
} catch (Exception e) {
e.printStackTrace();
}
return bitmap; // if error return the original bitmap
}
我相信這有與具有獨特的alpha通道相比,將alpha預乘到顏色分量中,以更直接地(並因此有效地)與實際顯示實現兼容地生成格式。 –
@ChrisStratton是否意味着我應該更改/重新轉換服務器上的圖像,還是應該修改addShadow函數? – ajacian81
如果您能接受,在服務器上更改它們可能是運行時效率最高的解決方案。 –