如何在Android中的图像上绘制文本

时间:2017-06-07 22:02:30

标签: java android android-canvas draw android-shape

我已经看过无数种方法,但仍然没有达到预期的效果;我想要实现的目标是:

  • 绘制一个矩形,它是屏幕的整个宽度,约为屏幕高度的1/3,矩形的可见度为50%/ alpha(因此可以在矩形下方略微看到图像),矩形将被放置在屏幕的最底部
  • 在矩形中放置一个多行字符串,文本集中在矩形的中间

以上是我希望实现的基本概念,但如果可能的话,我想生成一个小方块的地图,位于矩形内的左侧 - 如何将其添加到位图/ canvas也非常有用。

我当前的实现(没有正确的形状或文本大小)可以在下面看到:

Bitmap bitmap = BitmapFactory.decodeByteArray(picture, 0, picture.length);
Bitmap newBitmap = ImageUtils.drawMultilineTextToBitmapV2(MainActivity.this, bitmap, imageText);

...

public static Bitmap drawMultilineTextToBitmapV2(Context context, Bitmap bitmap, String text) {

    Bitmap.Config bitmapConfig = bitmap.getConfig();

    if (bitmapConfig == null) {
        bitmapConfig = Bitmap.Config.ARGB_8888;
    }

    Bitmap alteredBitmap = bitmap.copy(bitmapConfig, true);
    Canvas canvas = new Canvas(alteredBitmap);

    // Add image to canvas
    Paint paint = new Paint();
    canvas.drawBitmap(bitmap, 0, 0, paint);

    // Add background for text
    Paint p2 = new Paint();
    p2.setStyle(Paint.Style.FILL);
    p2.setColor(Color.GRAY);
    p2.setAlpha(0x80);

   // int padding = 50;
    int padding = 1000;
    Rect rect = new Rect(
            canvas.getWidth() - padding, // Left
            canvas.getHeight() - padding, // Top
            padding, // Bottom
            canvas.getWidth() + padding // Right
    );
    canvas.drawRect(rect, p2);

    // Add text
    paint.setColor(Color.WHITE);
    paint.setTextSize(250);
    canvas.drawText(text, bitmap.getWidth(), bitmap.getHeight(), paint);

    canvas.save();
    return alteredBitmap;
}

对此的任何帮助将不胜感激。

更新

String saveFilePath = FileUtils.saveImageToInternalStorage(newBitmap, fileDirectory, fileName, dateObject);

...

将位图/画布保存到文件中,然后用户可以再次访问它。

public static String saveImageToInternalStorage(Bitmap finalBitmap, File fileDirectory, String fileName, Date date) {

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm", Locale.UK);
    String now = simpleDateFormat.format(date);

    fileDirectory = new File(fileDirectory + DCA_FILE_PATH);
    fileDirectory.mkdirs();

    if (fileName.isEmpty()) {
        DecimalFormat df = new DecimalFormat("000000");
        int i = 1;
        String startingNumber = df.format(i);
        fileName = now + "-" + startingNumber + ".jpg";
    } else {
        fileName = now + "-" + fileName + ".jpg";
    }

    File file = new File(fileDirectory, fileName);
    try {
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    Log.d(TAG, "Saving Internal File to: " + file.getAbsolutePath());
    return file.getAbsolutePath();

}

更新2:

申请程序:

  • 使用相机视图在应用内拍照
  • 照片以字节形式返回并转换为位图
  • 将位图转换为需要创建文本和矩形然后转换回位图的画布
  • 然后将位图保存为文件
  • 用户点击文件以查看包含文字/矩形的照片

2 个答案:

答案 0 :(得分:1)

你可以通过使用相对布局(也可以通过框架)来做到这一点,你可以在布局中设置图像视图,并在它上面添加方形或任何其他布局,你想要的任何位置。像这样的代码你的xml布局:

<RelativeLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:background="@drawable/bg_gv_item"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
    android:id="@+id/img_gv_medical_guide_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:adjustViewBounds="true"
    android:scaleType="centerCrop"
    />
<TextView
    android:id="@+id/txt_category_title"
    android:layout_gravity="center"
    android:textColor="@color/colorWhite"
    android:background="@drawable/bg_category_title_rounded_rectangle"
    android:gravity="center_horizontal"
    android:layout_centerInParent="true"
    android:textStyle="bold"
    android:textSize="15sp"
    android:text=""
    android:layout_margin="10dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

使用可绘制的bg作为textview,你可以随心所欲地控制它(1/3)或任何你想要的。希望这可以帮助你一点点。

答案 1 :(得分:0)

通过以下方式实现:

{{1}}