一、簡介
命名: ImageViewMagnifierStrategy
使用場景:-針對ImageView加載大圖片壓縮時顯示更清晰
核心:提取-局部增大-應用
二、步驟
private intmWidth;
private intmHeight;
...
Bitmap bm1 = BitmapFactory.decodeFile(uri); ?//uri :Your image path
mWidth=bm.getWidth();
mHeight=bm.getHeight();
int[][]b=new int[mWidth][mHeight];
Bitmap bm2=Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),Bitmap.Config.ARGB_8888);
//1.提取&局部增大
for (int i = 100; i < mWidth - 100; i++) {
? ? ? for (int j = 100; j < mHeight - 100; j++) {
? ? ? ? ? ? ? if((bm1.getPixel(i,j)&0xFF)<255) {
? ? ? ? ? ? ? ? ? ? ? b[i][j]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i-1][j]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+1][j]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i][j-1]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i][j+1]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i-1][j-1]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+1][j+1]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i-1][j+1]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+2][j-1]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+2][j]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+2][j+1]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+2][j+2]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i-1][j+2]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i][j+2]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+1][j+2]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i][j+2]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+2][j]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? //根據情況再加? ? ? ? ? ? ? ? ? ? ? b[i][j+3]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+3][j]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i][j+4]=0xff000000;
? ? ? ? ? ? ? ? ? ? ? b[i+4][j]=0xff000000;
? ? ? ? ? ?}
? ? ? ?}
}
//3.應用
for (int i = 100; i < mWidth; i++) {
? ? ? ? ? ? for (int j = 100; j < mHeight; j++) {
? ? ? ? ? ? ? ? ? bm2.setPixel(i,j,b[i][j]);
? ? ? ? ? ? ?}
?}
ivCover.setImageBitmap(bm2); ?//ivCover : Your ImageView
四、總結回顧
提取bitmap像素密度,進行局部放大,重新設置bitmap的像素密度
新建二維數組儲存像素點,從bm的寬高開始一個一個像素的查找,得到的每一個bm像素值&0xFF把負值變成正值(畫布是白色(0xFFFFFF),有顏色就是rgb即有值,& 0xFF后得到的值小于255代表找到了rgb不為FF的情況,因為rgb的范圍是0-255,遍歷找到bitmap中的所有符合的像素點,然后以該點為中心,擴散到周圍9個點的點陣,如果還需要繼續放大,往右往下再擴散一圈,直到你想要的清晰度,最后再遍歷,繪制已經局部放大的像素點,設置到bitmap,運用即可.