資源簡介
Android不支持將Bitmap轉換成單色的Bmp圖片,所以參考Bmp格式說明,自己寫了一個轉換類。親測有效!!!
代碼片段和文件信息
package?com.lanhetech.core.qrcode.utils;
import?android.graphics.Bitmap;
/**
?*?保存為單色位圖,即使黑白位圖
?*/
public?class?BmpUtil?{
????/**
?????*?保存為單色bmp格式的完整字節數
?????**/
????public?static?byte[]?changeToMonochromeBitmap(Bitmap?bmp)?{
????????int[]?binarys?=?gray2Binary(bmp);
????????byte[]?data?=?compressMonoBitmap(bmp?binarys);
????????byte[]?header?=?addBMPImageHeader(data.length?+?62);
????????byte[]?infos?=?addBMPImageInfosHeader(bmp.getWidth()?bmp.getHeight());
????????byte[]?buffer?=?new?byte[62?+?data.length];
????????System.arraycopy(header?0?buffer?0?header.length);
????????System.arraycopy(infos?0?buffer?14?infos.length);
????????System.arraycopy(data?0?buffer?62?data.length);
????????return?buffer;
????}
????/**
?????*?保存為單色bmp數據,不包含頭,正向頭
?????**/
????public?static?byte[]?changeSingleBytes(Bitmap?bmp)?{
????????int[]?binarys?=?gray2Binary(bmp);
????????byte[]?data?=?compressMonoBitmap_ps(bmp?binarys);
????????return?data;
????}
????/**
?????*?將彩色圖轉換為灰階圖,并二值化處理
?????*
?????*?@param?bmp?位圖
?????*?@return?返回灰階圖二值化后的顏色int[]
?????*/
????private?static?int[]?gray2Binary(Bitmap?bmp)?{
????????int?width?=?bmp.getWidth();???//?獲取位圖的寬
????????int?height?=?bmp.getHeight();?//?獲取位圖的高
????????int[]?pixels?=?new?int[width?*?height];??//?通過位圖的大小創建像素點數組
????????bmp.getPixels(pixels?0?width?0?0?width?height);???//?int?0?代表0XFFFFFFFF即是1.0完全不透明,0.0f完全透明。黑色完全透明。
????????for?(int?i?=?0;?i?????????????for?(int?j?=?0;?j?????????????????int?grey?=?pixels[width?*?i?+?j];??//?第幾行,第幾個
????????????????//?分離三原色
????????????????int?alpha?=?((grey?&?0xFF000000)?>>?24);?//?透明度
????????????????int?red?=?((grey?&?0x00FF0000)?>>?16);???//?紅色
????????????????int?green?=?((grey?&?0x0000FF00)?>>?8);??//?綠色
????????????????int?blue?=?(grey?&?0x000000FF);??????????//?藍色
????????????????if?(alpha?==?0)?{??//?透明度為0,則說明沒有顏色,那變更為白色
????????????????????pixels[width?*?i?+?j]?=?0;???????????//?白色是0
????????????????????continue;
????????????????}
????????????????grey?=?(int)?(red?*?0.3?+?green?*?0.59?+?blue?*?0.11);??//?轉化為灰度圖??灰度值:255為白色,0為黑色
????????????????//?TODO:?2016/12/27?灰度值為200,可調整該參數
????????????????grey?=?grey?200???1?:?0;??//?灰度小于200就轉化為黑色,不然就為白色。200為可調整參數。//?二值化
????????????????pixels[width?*?i?+?j]?=?grey;
????????????}
????????}
????????return?pixels;
????}
????/**
?????*?壓縮為完整單色bmp數組,并反向
?????*
?????*?@param?bmp?????壓縮需要用到位圖的寬度,高度。
?????*?@param?binarys?二值化數據
?????*?@return
?????*/
????private?static?byte[]?compressMonoBitmap(Bitmap?bmp?int[]?binarys)?{
????????int?width?=?bmp.getWidth();???//?獲取位圖的寬
????????int?height?=?bmp.getHeight();?//?獲取位圖的高
????????//?行補位的公式為?widthBytes?=?(width*biBitCount+31)/32*4
????????//?需要轉化為單色,所以biBitCount=1;
????????//?確定一行幾個字節
????????int?widthBytes?=?(width?+?31)?/?32?*?4;
????????byte[]?newss?=?new?byte[widthBytes?*?height];
????????for?(int?i?=?height;?i?>?0;?i--)?{
????????????for?(int?j?
- 上一篇:XSS檢測原型系統
- 下一篇:gson-2.6.2.jar
評論
共有 條評論