注意,我说的是单色图,不是灰度图,也就是只有黑白两色的图。
具体的思路是:我们知道一张图,如果不考虑透明度的话,是由一个一个的点组成的,每个点,就是一个颜色点(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
转载自原文链接, 如需删除请联系管理员。
原文链接:将任何普通图片转换为单色图,转载请注明来源!