2015-03-16 3 views
1

Я пытаюсь напечатать русский текст на принтере, но он не поддерживается, поэтому я решил распечатать изображение с текстом. Вот как я создаю изображение с текстом:конвертировать растровое изображение в 1 бит растровое изображение

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. Так что мне нужен способ преобразования этого изображения в 1 бит растрового изображения. Я попытался this решение , но я получил: enter image description here

но это изображение плохо (

РЕШЕНИЕ НАЙДЕНО ответил я сам, смотри ниже

ответ

3

Это чудо, ребята, я получил его работу. После того, как 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); 
     } 
    } 

благодаря Android: Converting a Bitmap to a Monochrome Bitmap (1 Bit per Pixel)

+0

HI Я ищу то же самое. Можете ли вы рассказать мне после создания изображения, как ваше изображение отправки на принтер. – Murali

1

Я почти уверен, что ваш вопрос только шрифт, который вы используете. Поскольку современные шрифты получают большую степень удобочитаемости с помощью сглаживания, вполне возможно, что ваш шрифт выглядит так, как будто все эти серые цвета (которые используются для сглаживания) повторно снял.

Я считаю, что единственный шанс, который у вас есть, - изменить шрифт на тот, где эта проблема не такая большая. Например, попробуйте шрифт MONOSPACE.

Вы также можете подумать об использовании полного Bitmapfont, то есть шрифта, в котором вы вручную создаете набор, в котором каждая буква имеет отображаемое растровое изображение, которое вы используете для представления этой буквы на вашем растровом изображении, которое вы отправляете на принтер.

Последнее, но не менее важное: попробуйте просто напечатать больше, поэтому выделяя больше пикселей для каждой буквы и уменьшая влияние однопиксельных черно-белых решений.

+0

спасибо за попытку, но enlarding и изменения начертания шрифта MonoSpace не делать работа. но в любом случае большое спасибо за усилия –