将位图转换为 1 位位图
convert bitmap to 1bit bitmap
我想在打印机上打印俄文文本,但不支持,所以我决定打印带文本的图像。以下是我如何使用文本创建图像:
public Bitmap textAsBitmap(String text, float textSize, int textColor) {
Paint paint = new Paint();
paint.setTextSize(textSize);
paint.setColor(textColor);
paint.setAntiAlias(true);
paint.setTypeface(Typeface.SANS_SERIF);
paint.setTextAlign(Paint.Align.LEFT);
//int width = (int) (paint.measureText(text) + 0.5f); // round
int width = 200; // round
float baseline = (int) (-paint.ascent() + 0.5f); // ascent() is negative
//int height = (int) (baseline + paint.descent() + 0.5f);
int height=60;
Log.e("height",height+"");
Log.e("width",width+"");
Bitmap image = Bitmap.createBitmap(width, 2*height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(image);
canvas.drawColor(Color.WHITE);
canvas.drawText(text, 0, baseline, paint);
baseline+=20;
canvas.drawText(text, 0,baseline , paint);
return image;
}
它工作正常。但问题是这台中文打印机只打印 1 位 bitmap.So 我需要一种方法将此图像转换为 1 位位图。
我尝试了 this 解决方案
但我得到了:
但是这张图不好(
已找到解决方案
我自己回答,见下文
我很确定您的问题只是您使用的字体。
由于现代字体通过使用抗锯齿获得了很多可读性,因此当所有那些灰色(用于抗锯齿)被剥离时,您的字体很可能看起来就像那样。
我相信您唯一的机会就是将字体更改为问题不是那么大的字体。例如尝试字体 MONOSPACE。
您也可以考虑使用完整的位图字体,即您手动创建排版的字体,其中每个字母都有一个代表位图,您可以使用该位图在发送到打印机的位图中代表该字母。
最后但同样重要的是,您可以尝试简单地打印更大的字体,从而为每个字母分配更多像素并减少单像素 black/white 决策的影响。
真是个奇迹,我成功了。创建位图后[我将其转换为 32bpp 然后根据最后一位将每个像素设置为黑色或白色
Paint paint = new Paint();
paint.setTextSize(textSize);
paint.setColor(textColor);
paint.setTextAlign(Paint.Align.LEFT);
paint.setTypeface(Typeface.MONOSPACE);
int width = (int) (paint.measureText(text) + 0.5f); // round
float baseline = (int) (-paint.ascent() + 0.5f); // ascent() is negative
int height = (int) (baseline + paint.descent() + 0.5f);
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(image);
canvas.drawColor(Color.WHITE);
canvas.drawText(text, 0, baseline, paint);
Bitmap bmpMonochrome = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas1 = new Canvas(bmpMonochrome);
ColorMatrix ma = new ColorMatrix();
ma.setSaturation(0);
Paint paint1 = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(ma));
canvas1.drawBitmap(image, 0, 0, paint1);
int width2 = bmpMonochrome.getWidth();
int height2 = bmpMonochrome.getHeight();
int[] pixels = new int[width2 * height2];
bmpMonochrome.getPixels(pixels, 0, width2, 0, 0, width2, height2);
// Iterate over height
for (int y = 0; y < height2; y++) {
int offset = y * height2;
// Iterate over width
for (int x = 0; x < width2; x++) {
int pixel = bmpMonochrome.getPixel(x, y);
int lowestBit = pixel & 0xff;
if(lowestBit<128)
bmpMonochrome.setPixel(x,y,Color.BLACK);
else
bmpMonochrome.setPixel(x,y,Color.WHITE);
}
}
感谢Android: Converting a Bitmap to a Monochrome Bitmap (1 Bit per Pixel)
我想在打印机上打印俄文文本,但不支持,所以我决定打印带文本的图像。以下是我如何使用文本创建图像:
public Bitmap textAsBitmap(String text, float textSize, int textColor) {
Paint paint = new Paint();
paint.setTextSize(textSize);
paint.setColor(textColor);
paint.setAntiAlias(true);
paint.setTypeface(Typeface.SANS_SERIF);
paint.setTextAlign(Paint.Align.LEFT);
//int width = (int) (paint.measureText(text) + 0.5f); // round
int width = 200; // round
float baseline = (int) (-paint.ascent() + 0.5f); // ascent() is negative
//int height = (int) (baseline + paint.descent() + 0.5f);
int height=60;
Log.e("height",height+"");
Log.e("width",width+"");
Bitmap image = Bitmap.createBitmap(width, 2*height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(image);
canvas.drawColor(Color.WHITE);
canvas.drawText(text, 0, baseline, paint);
baseline+=20;
canvas.drawText(text, 0,baseline , paint);
return image;
}
它工作正常。但问题是这台中文打印机只打印 1 位 bitmap.So 我需要一种方法将此图像转换为 1 位位图。
我尝试了 this 解决方案
但我得到了:
但是这张图不好(
已找到解决方案 我自己回答,见下文
我很确定您的问题只是您使用的字体。 由于现代字体通过使用抗锯齿获得了很多可读性,因此当所有那些灰色(用于抗锯齿)被剥离时,您的字体很可能看起来就像那样。
我相信您唯一的机会就是将字体更改为问题不是那么大的字体。例如尝试字体 MONOSPACE。
您也可以考虑使用完整的位图字体,即您手动创建排版的字体,其中每个字母都有一个代表位图,您可以使用该位图在发送到打印机的位图中代表该字母。
最后但同样重要的是,您可以尝试简单地打印更大的字体,从而为每个字母分配更多像素并减少单像素 black/white 决策的影响。
真是个奇迹,我成功了。创建位图后[我将其转换为 32bpp 然后根据最后一位将每个像素设置为黑色或白色
Paint paint = new Paint();
paint.setTextSize(textSize);
paint.setColor(textColor);
paint.setTextAlign(Paint.Align.LEFT);
paint.setTypeface(Typeface.MONOSPACE);
int width = (int) (paint.measureText(text) + 0.5f); // round
float baseline = (int) (-paint.ascent() + 0.5f); // ascent() is negative
int height = (int) (baseline + paint.descent() + 0.5f);
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(image);
canvas.drawColor(Color.WHITE);
canvas.drawText(text, 0, baseline, paint);
Bitmap bmpMonochrome = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas1 = new Canvas(bmpMonochrome);
ColorMatrix ma = new ColorMatrix();
ma.setSaturation(0);
Paint paint1 = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(ma));
canvas1.drawBitmap(image, 0, 0, paint1);
int width2 = bmpMonochrome.getWidth();
int height2 = bmpMonochrome.getHeight();
int[] pixels = new int[width2 * height2];
bmpMonochrome.getPixels(pixels, 0, width2, 0, 0, width2, height2);
// Iterate over height
for (int y = 0; y < height2; y++) {
int offset = y * height2;
// Iterate over width
for (int x = 0; x < width2; x++) {
int pixel = bmpMonochrome.getPixel(x, y);
int lowestBit = pixel & 0xff;
if(lowestBit<128)
bmpMonochrome.setPixel(x,y,Color.BLACK);
else
bmpMonochrome.setPixel(x,y,Color.WHITE);
}
}
感谢Android: Converting a Bitmap to a Monochrome Bitmap (1 Bit per Pixel)