保存Imageview使用textview到位图

时间:2017-08-22 20:19:38

标签: android image canvas bitmap

目前我正在制作照片编辑器应用。我有活动,您可以在其中添加文本到图像。我需要在位图中保存带有文本的图像。我已经尝试过保存绘图缓存,但问题是它会以低质量保存图像。原始图像4032 * 3024当我保存时使用的图像视图大小为1517 * 1137.我已经尝试将位图缩放到原始大小,但质量太差。现在,我试图在画布上绘制原始位图,然后在与View上相同的位置上绘制文本。 float x = editText.getLeft() * (scale); float y = editText.getTop() * (scale); canvas.drawText(editText.getText().toString(), x, y, tp); 但由于某种原因,文字不在同一个地方。我尝试使用密度来获取坐标,但它也不起作用。

 <RelativeLayout

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/add_text_color_picker_relative_layout"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true">

    <RelativeLayout
        android:id="@+id/edit_photo_add_text_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true">

        <ImageView
            android:id="@+id/edit_photo_add_text_main_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:adjustViewBounds="true"
            android:scaleType="fitCenter" />

        <EditText
            android:id="@+id/edit_photo_add_text_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/rect_edittext"
            android:hint="Поле для текста"
            android:inputType="textNoSuggestions"
            android:padding="4dp"
            android:textSize="14dp" />
    </RelativeLayout>

</RelativeLayout>

这是java代码:

public Bitmap createImage(View view, int imageViewId, int textViewId, Context context){
     ImageView imageView = (ImageView) view.findViewById(imageViewId);

    Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();

    float bitmapRatio = (bitmap.getWidth()) / bitmap.getHeight();
    float imageViewRatio = (imageView.getWidth()) / imageView.getHeight();

    float scaleW = bitmap.getWidth() / imageView.getWidth();
    float scaleH = bitmap.getHeight() / imageView.getHeight();
    android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
    bitmap = bitmap.copy(bitmapConfig, true);

    EditText editText = (EditText) view.findViewById(textViewId);

    float density = context.getResources().getDisplayMetrics().density;
    Canvas canvas = new Canvas(bitmap);
    canvas.setBitmap(bitmap);
    TextPaint tp = new TextPaint(TextPaint.ANTI_ALIAS_FLAG);
    tp.setColor(Color.WHITE);
    tp.setTextSize(editText.getTextSize()*density);

    Resources resources = context.getResources();
    float scale = resources.getDisplayMetrics().density;

    int[] xy = {0, 0};
    editText.getLocationOnScreen(xy);
    float x = xy[0] * (scaleW);
    float y = xy[1] * (scaleH);

    canvas.drawText(editText.getText().toString(), x, y, tp);
    canvas.save();
    canvas.restore();

    return bitmap;  }

2 个答案:

答案 0 :(得分:1)

PictureBoxeditText.getLeft()提供相对于其父级的坐标,而editText.getTop()将绝对坐标(相对于根)作为参数。

您应该获取editText的绝对坐标(相对于层次结构中的根元素)。要查找绝对视图坐标,可以使用view.getLocationOnScreen()或view.getLocationInWindow()。感谢。

答案 1 :(得分:0)

最后,我找到了解决方案。 当我计算屏幕比例时

$ openssl rsa -check -inform pem -noout -in private.pem RSA key ok ...

我划分为整数并接收错误的值; 应该有

而不是它

float scaleW = bitmap.getWidth() / imageView.getWidth();

然后你可以在画布的正确位置画画。