【问题标题】:Draw text on Bitmap with fixed position在固定位置的位图上绘制文本
【发布时间】:2019-07-19 23:30:10
【问题描述】:

我正在尝试使用下面的代码在位图上绘制两个文本,一切正常,但是如果文本的位置变小,我会遇到位图大小的问题,例如

1080x1920

250x268

代码:

public Bitmap drawTextToBitmapVHS(Context gContext,
                                      Bitmap bitmap) {
        String PLAY = "PLAY ►";
        String DATE = getDate(Calendar.getInstance());
        android.graphics.Bitmap.Config bitmapConfig =
                bitmap.getConfig();
        if (bitmapConfig == null) {
            bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
        }
        bitmap = bitmap.copy(bitmapConfig, true);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        double relation = Math.sqrt(canvas.getWidth() * canvas.getHeight()) / 250;
        paint.setTextSize((float) (12 * relation));
        paint.setTypeface(Typeface.create(Typeface.createFromAsset(getAssets(), "fonts/VCR.ttf"), Typeface.BOLD));
        Rect bounds = new Rect();
        paint.getTextBounds(DATE, 0, DATE.length(), bounds);
        int horizontalSpacing = 24;
        int verticalSpacing = 36;
        int x = horizontalSpacing;
        int y = bitmap.getHeight() - verticalSpacing;
        canvas.drawText(PLAY,
                x, bounds.height() + verticalSpacing, paint);
        canvas.drawText(getHours(Calendar.getInstance()), x, y - 50, paint);
        canvas.drawText(DATE, x, y, paint);
        return bitmap;
    }

尽管位图的大小与第一张图像 (1080x1920) 完全相同,但我如何才能修复文本,谢谢。

【问题讨论】:

    标签: java android canvas android-bitmap drawtext


    【解决方案1】:

    问题似乎与您的硬编码间距以及您对文本大小的计算有关。如果您使这些相对于位图大小,它可能会有所帮助,例如:

    int horizontalSpacing = 24 * bitmap.getWidth() / 1080;
    int verticalSpacing = 36 * bitmap.getHeight() / 1920;
    

    这应该将位置设置为与 1080x1920 位图相同,但对于小位图,您可能会发现文本重叠,除非您同样调整相对于位图高度的文本大小:

    paint.setTextSize((float) (70 * bitmap.getHeight() / 1920));
    

    您对时间字段的定位也是硬编码的,需要更改:

    int hoursOffset = 50 * bitmap.getHeight() / 1920;
    canvas.drawText(getHours(Calendar.getInstance()), x, y - hoursOffset, paint);
    

    综合起来,这将以与 1080x1920 位图相同的相对位置和大小绘制文本。

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多