目前我正在制作照片编辑器应用。我有活动,您可以在其中添加文本到图像。我需要在位图中保存带有文本的图像。我已经尝试过保存绘图缓存,但问题是它会以低质量保存图像。原始图像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; }
答案 0 :(得分:1)
PictureBox
和editText.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();
然后你可以在画布的正确位置画画。