将位图转换为1位位图

时间:2015-03-16 13:33:04

标签: java android bitmap bit

我正在尝试在打印机上打印俄语文本,但它不受支持,因此我决定使用文本打印图像。这是我用文本创建图像的方式:

 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位位图。 我尝试了this解决方案 但我得到了: enter image description here

但这张照片不好(

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

2 个答案:

答案 0 :(得分:3)

是一个奇迹的家伙,我让它发挥作用。创建位图后[我将其转换为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)

答案 1 :(得分:1)

我非常确定您的问题只是您使用的字体。 由于现代字体通过使用抗锯齿获得了很多可读性,因此当所有这些灰色(用于抗锯齿)被剥离时,很可能你的字体看起来很像。

我相信你唯一的机会就是将字体改为那个问题并不大的字体。例如,尝试使用字体MONOSPACE。

您也可以考虑使用完整的Bitmapfont,即手动创建排版的字体,其中每个字母都有一个代表位图,用于表示您发送到打印机的位图上的那个字母。

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