Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将位图转换为1位位图_Java_Android_Bitmap_Bit - Fatal编程技术网

Java 将位图转换为1位位图

Java 将位图转换为1位位图,java,android,bitmap,bit,Java,Android,Bitmap,Bit,我试图在打印机上打印俄文文本,但它不受支持,所以我决定用文本打印图像。以下是我如何使用文本创建图像: public Bitmap textAsBitmap(String text, float textSize, int textColor) { Paint paint = new Paint(); paint.setTextSize(textSize); paint.setColor(textColor); paint.setA

我试图在打印机上打印俄文文本,但它不受支持,所以我决定用文本打印图像。以下是我如何使用文本创建图像:

 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位位图。所以我需要一种方法将此图像转换为1位位图。 我试着解决这个问题 但我得到了:

但这个形象很糟糕(

找到解决方案
我回答自己,见下文

我很确定你的问题只是你使用的字体。 由于现代字体通过使用抗锯齿获得了很大的可读性,所以当所有的灰色(用于抗锯齿)被去除时,很可能您的字体就是这样

我相信你唯一的机会就是把字体改成一个问题不大的字体。比如说,试着用MONOSPACE字体

您还可以考虑使用完整的位图字体,即手动创建字体的字体,其中每个字母都有一个表示位图,用于在发送到打印机的位图上表示该字母


最后但并非最不重要的一点是,您可以尝试打印更大的字体,从而为每个字母分配更多像素,并减少单像素黑白决策的影响。

我非常确定,您的问题只是您使用的字体。 由于现代字体通过使用抗锯齿获得了很大的可读性,所以当所有的灰色(用于抗锯齿)被去除时,很可能您的字体就是这样

我相信你唯一的机会就是把字体改成一个问题不大的字体。比如说,试着用MONOSPACE字体

您还可以考虑使用完整的位图字体,即手动创建字体的字体,其中每个字母都有一个表示位图,用于在发送到打印机的位图上表示该字母


最后但并非最不重要的一点是,您可以尝试打印更大的字体,从而为每个字母分配更多的像素,并减少单像素黑白决策的影响。

这是一个奇迹,伙计们,我让它工作了。在将bitma[我将其转换为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);
        }
    }
油漆=新油漆();
paint.setTextSize(textSize);
paint.setColor(textColor);
paint.setTextAlign(paint.Align.LEFT);
绘制.setTypeface(字体.MONOSPACE);
int宽度=(int)(paint.measureText(text)+0.5f);//四舍五入
浮点基线=(int)(-paint.ascent()+0.5f);//ascent()为负
内部高度=(内部)(基线+绘制下降()+0.5f);
位图图像=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888);
画布=新画布(图像);
画布。drawColor(颜色。白色);
画布.drawText(文本,0,基线,绘制);
位图bmpMonochrome=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888);
Canvas canvas1=新画布(bmpMonochrome);
ColorMatrix ma=新的ColorMatrix();
ma.设定饱和度(0);
油漆油漆1=新油漆();
paint.setColorFilter(新的ColorMatrixColorFilter(ma));
canvas1.drawBitmap(图像,0,0,paint1);
int width2=bmpMonochrome.getWidth();
int height2=bmpMonochrome.getHeight();
int[]像素=新的int[width2*height2];
获取像素(像素,0,宽度2,0,0,宽度2,高度2);
//迭代高度
对于(int y=0;y如果(最低位这真是个奇迹,伙计们,我让它工作了。我把比特转换成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);
        }
    }
油漆=新油漆();
paint.setTextSize(textSize);
paint.setColor(textColor);
paint.setTextAlign(paint.Align.LEFT);
绘制.setTypeface(字体.MONOSPACE);
int宽度=(int)(paint.measureText(text)+0.5f);//四舍五入
浮点基线=(int)(-paint.ascent()+0.5f);//ascent()为负
内部高度=(内部)(基线+绘制下降()+0.5f);
位图图像=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888);
画布=新画布(图像);
画布。drawColor(颜色。白色);
画布.drawText(文本,0,基线,绘制);
位图bmpMonochrome=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888);
Canvas canvas1=新画布(bmpMonochrome);
ColorMatrix ma=新的ColorMatrix();
ma.设定饱和度(0);
油漆油漆1=新油漆();
paint.setColorFilter(新的ColorMatrixColorFilter(ma));
canvas1.drawBitmap(图像,0,0,paint1);
int width2=bmpMonochrome.getWidth();
int height2=bmpMonochrome.getHeight();
int[]像素=新的int[width2*height2];
获取像素(像素,0,宽度2,0,0,宽度2,高度2);
//迭代高度
对于(int y=0;y如果)谢谢你的尝试,但将字体放大并更改为单空间并没有起作用。但是无论如何,非常感谢你的努力。谢谢你的尝试,但将字体放大并更改为单空间并没有起作用。但是无论如何,非常感谢你的努力。我正在寻找相同的。创建图像后,你能告诉我如何将图像发送到打印机吗.嗨,我在找同样的。在创建图像后,您能告诉我如何将图像发送到打印机吗。