1. 程式人生 > >將任何普通圖片轉換為單色圖

將任何普通圖片轉換為單色圖

注意,我說的是單色圖,不是灰度圖,也就是隻有黑白兩色的圖。

具體的思路是:我們知道一張圖,如果不考慮透明度的話,是由一個一個的點組成的,每個點,就是一個顏色點(R,G,B),每個顏色點的取值範圍(0~255,0~255,0~255).

所以要將一張普通圖片轉化為單色圖,首先要考慮的就是“曝光度”,比如我們取中間值,127,凡是在127以上的,我們認為是黑色,127以下的,我們認為是白色,具體來說就是(R>127,G>127,B>127),這就是最平均的中等曝光度,如果取值增大,曝光度增加,相應的,圖片中黑色的部分就會增多,反之相反。比如說,有這麼一個顏色點,(25,40,60),如果設定的曝光度很小的話,比如說曝光度=15,凡是大於15的就讓他變成純黑,那麼稍稍有點顏色,就會變成黑色了,反之,設定的較大的話,則只有顏色較深的點才會變成黑色。

具體的程式碼:

/**
* 獲取單色點陣圖
*/
public static Bitmap getSinglePic(Bitmap inputBMP) {
int[] pix = new int[inputBMP.getWidth() * inputBMP.getHeight()];
int[] colorTemp = new int[inputBMP.getWidth() * inputBMP.getHeight()];
inputBMP.getPixels(pix, 0, inputBMP.getWidth(), 0, 0,
inputBMP.getWidth(), inputBMP.getHeight());
Bitmap returBMP = Bitmap.createBitmap(inputBMP.getWidth(),
inputBMP.getHeight(), Config.RGB_565);
int lightNumber = 127;//曝光度,這個顔色是中間值,如果大於中間值,那就是黑色,否則白色,數值越小,曝光度越高
for(int j = 0;j<colorTemp.length; j++){
colorTemp[j] = Color.rgb(Color.red(pix[j]),
Color.green(pix[j]), Color.blue(pix[j]));
}
for (int i = 0; i < colorTemp.length; i++) {
int r = Color.red(pix[i]);
int g = Color.green(pix[i]);
int b = Color.blue(pix[i]);
if(r+g+b>3*lightNumber){//三種顏色相加大於3倍的曝光值,才是黑色,否則白色
colorTemp[i] = Color.rgb(255,255,255);
}else{
colorTemp[i] = Color.rgb(0,0,0);
}
}
returBMP.setPixels(colorTemp, 0, inputBMP.getWidth(), 0, 0,
inputBMP.getWidth(), inputBMP.getHeight());
return returBMP;
}

另外,我這裡還寫了一個呼叫系統資源管理器,開啟本地圖片,自動轉換的程式碼:

@Override
protected void onActivityResult(final int requestCode, int resultCode,
final Intent data) {
switch (requestCode) {
case CONNECT_DEVICE:
if (resultCode == Activity.RESULT_OK) {
dialog.show();
new Thread(new Runnable() {
public void run() {
myOpertion.open(data);
}
}).start();
}


break;
case ENABLE_BT:
if (resultCode == Activity.RESULT_OK) {
myOpertion.chooseDevice();
} else {
Toast.makeText(this, R.string.bt_not_enabled,
Toast.LENGTH_SHORT).show();
}
break;
case OPEN_FILE:
if (resultCode == Activity.RESULT_OK) {
try {
Uri uri = data.getData();// 得到uri,後面就是將uri轉化成file的過程。
String img_path = getImageAbsolutePath(this, uri);
File file = new File(img_path);
Toast.makeText(MainActivity.this, file.toString(),
Toast.LENGTH_SHORT).show();
bitmap = BitmapFactory.decodeFile(file.getPath());
bitmap = Bitmap.createScaledBitmap(bitmap, 384,
384 * bitmap.getHeight() / bitmap.getWidth(), false);// 拉伸成為標準大小
bitmap = PrintUtils.getSinglePic(bitmap);//變成單色圖
handler.sendMessage(handler.obtainMessage(0, 1, 0, ""));
mPrinter.printText("Print Image:\n");
//PrintUtils.printBMPFile(file, bitmap, mPrinter);
PrintUtils.splitAndPrintBMP(bitmap, 90, mPrinter);
} catch (Exception e) {
e.toString();
}
}


break;
}
}


從圖中可以看出,轉換之後和之前的圖片效果。

這個主要是給熱敏印表機用的。

另外,如果對於單個畫素進行處理,比如,R>127,則R=255,那麼,就可以將圖片轉化為更加藝術的曝光圖片。

專案下載:http://download.csdn.net/detail/bywuu/9688722