簡體   English   中英

將位圖轉換為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;
    }

工作正常。 但是問題是這台中國打印機只打印1bit位圖,所以我需要一種將圖像轉換為1bit位圖的方法。 我嘗試了解決方案,但得到了: 在此處輸入圖片說明

但是這張圖片不好

找到的解決方案我回答了自己,請參閱下文

這是一個奇跡,我成功了。 在設置bitma [之后,我將其轉換為32bpp,然后根據最后一位將每個像素設置為Black或White

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:將位圖轉換為單色位圖(每像素1位)

我可以肯定,您的問題只是您使用的字體。 由於現代字體通過使用抗鋸齒而獲得了很多可讀性,因此當所有那些灰色(用於抗鋸齒)被剝去時,您的字體很有可能看起來完全像這樣。

我相信您唯一的機會就是將字體更改為問題不那么大的字體。 例如,嘗試使用字體MONOSPACE。

您可能還會考慮使用完整的Bitmapfont,即一種字體,您在其中手動創建一個排版,其中每個字母都有一個代表位圖,用來代表要發送到打印機的位圖上的字母。

最后但並非最不重要的一點是,您可以嘗試簡單地打印較大的像素,從而為每個字母分配更多像素,並減少單像素黑白決定的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM