Создать растровое изображение, используя строку

Я хочу создать Bitmap с использованием String, Проблема в том, когда я назначаю Paint и String Canvas, Все, что я вижу, это созданный точечный / черный пиксель, что-то не так с конфигами, которые я использую? Вот мой код ниже:

private void createBitmap(){
        int textSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, getApplicationContext().getResources().getDisplayMetrics());
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setSubpixelText(true);
        paint.setStyle(Paint.Style.FILL);
        paint.setTextSize(textSize);
        paint.setColor(Color.BLACK);

        int w = 500, h = 200;

        Bitmap.Config conf = Bitmap.Config.ARGB_8888; // see other conf types
        Bitmap myBitmap = Bitmap.createBitmap(w, h, conf);
        Canvas myCanvas = new Canvas(myBitmap);
        myCanvas.drawColor(Color.WHITE, PorterDuff.Mode.CLEAR);
        myCanvas.drawText("Just a string", 0, 0, paint);

        imageView = new ImageView(this);
        imageView.setImageBitmap(myBitmap);
}

1 ответ

y параметр на самом деле для базовой линии текста, так что вы ничего не увидите с y == 0, Точка, которую вы видите, является, вероятно, спуском "g" в "строке".

Попробуйте перейти на

        myCanvas.drawText("Just a string", 0, 100, paint);

по крайней мере, вы можете что-то увидеть.

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

Как только у вас есть Paint настроен, вы можете определить высоту текста в пикселях, вызвав getFontMetrics() на Paintзатем, глядя на FontMetrics ценности. ascent будет отрицательным, так как он измеряет вверх, так что вы можете получить приблизительное представление о высоте fm.descent - fm.ascent,

Вот способ нарисовать ваш текст чуть ниже верхнего края растрового изображения:

        Paint.FontMetrics fm = paint.getFontMetrics();
        int baseline = (int) - fm.ascent; // also fm.top instead of fm.ascent
        myCanvas.drawText("Just a string", 0, baseline, paint);
Другие вопросы по тегам