[英]Large Canvas/Bitmap in Scrollview or redraw Canvas on scroll? What way is faster and also avoids java.lang.OutOfMemoryError
[英]Faster way to redraw a bitmap in android?
我正在為OCR處理圖像,我需要更改位圖中一堆像素的顏色。 有沒有比setPixel和getPixel更快的方法? 目前我只是使用一種方法來執行for循環,該方法檢查輸入與一堆RGB值,如果匹配則返回true。 非常感謝你!
Bitmap img = myImage.copy(Bitmap.Config.ARGB_8888, true);;
for (int w = 0; w < img.getWidth(); w++) {
for (int h = 0; h < img.getHeight(); h++) {
int value = img.getPixel(w, h);
if (filter(value)) {
img.setPixel(w, h, Color.rgb(0, 0, 0));
} else img.setPixel(w, h, Color.rgb(255, 255, 255));
}
}
只是想跟進並發布代碼,如果有人通過搜索找到這個。
我在問題中的代碼平均需要3.4s,下面的代碼使用Gabe的建議時間不到200ms。 我還添加了一個長度變量,因為我讀取不調用array.length()每次迭代都可以提高性能,但在測試中似乎沒有太大的好處
int width = img.getWidth();
int height = img.getHeight();
int length = width * height;
int[] pixels = new int[width*height];
img.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < length; i++) {
if (filter(pixels[i])) {
pixels[i] = Color.rgb(0, 0, 0);
} else pixels[i] = Color.rgb(255, 255, 255);
}
img.setPixels(pixels, 0, width, 0, 0, width, height);
您可以隨時嘗試將圖像分解為象限/網格,並為每個象限分配一個單獨的線程。
我通常在Jni上使用OpenCV處理圖像。 它比在Java上處理快得多。 如果您不熟悉JNI,請參考此鏈接。 什么是JNI Graphics或如何使用它? 您還可以分割圖像,然后使用多線程處理!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.