0

您好,我有两个图像视图,一个带有从相机中选择的图片,另一个图像视图仅带有文本,例如“Made Hawk Nelson”,两个图像视图的图像如下

在此处输入图像描述

xml代码如下

  <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="7"
    android:scaleType="fitXY" >

    <ImageView
        android:id="@+id/imgSelectedPhoto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="fitXY" />

    <ImageView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/txt_made_hawk_nelson"
        android:layout_centerInParent="true" />

</RelativeLayout>

上图是半屏代码,上图也是半屏

现在我想保存这张照片,任何人都可以帮助我,我该怎么做?可能是 CANVAS 会帮助我,但我不知道该怎么做,所以请任何人帮助我

4

4 回答 4

1

这可能会对您有所帮助,这里需要使用必需的字符串更改功能,并传递您的背景图像,并使用和创建一个单一的drawable调整字体大小、文本颜色和对齐方式并检查它。CanvasBitmap

private Bitmap getThumb(String strangle, String strnote, int width, int height) {

  //Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.transperet_bg);
  Bitmap bmOverlay = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

  Canvas canvas = new Canvas(bmOverlay);
  Paint paint = new Paint();

  paint.setColor(Color.WHITE);
  paint.setTextSize(20);
  paint.setFlags(Paint.ANTI_ALIAS_FLAG);
  // if the background image is defined in main.xml, omit this line
  canvas.drawARGB(140, 0, 0, 0);
  //canvas.drawBitmap(mBitmap, 0, 0, null);
  // draw the text and the point
  paint.setTextAlign(Paint.Align.LEFT);

  canvas.drawText("Head Angel = " + strangle, 10, 20, paint);

  strnote = edtnote.getText().toString();
  if (TextUtils.isEmpty(strnote)) {
   strnote = "Note";
  }
  canvas.drawText(strnote, 10, 50, paint);
  paint.setTextAlign(Paint.Align.RIGHT);

  canvas.drawText("www.moovemtb.com", width-60, 50, paint);
  canvas.drawText("Head Angel App", width-60, 20, paint);

  canvas.drawPoint(30.0f, height/2, paint);
  return bmOverlay;
 }
于 2013-04-02T11:52:19.070 回答
1

你有正确的想法。画布将是最简单的方法。

但是您必须首先了解这些 ImageView 只是屏幕上的表示,并且创建一个位图与这两个重叠的图像与屏幕上的表示几乎没有关系。

在图像的内存表示中,您将拥有 Drawables(根据屏幕大小预先缩放,因此它们的大小会根据 ldpi、mdpi、hdpi 和 xhdpi 文件夹因设备而异)和位图,它们是绝对表示.

我刚才所说的一切都会根据您的应用程序而有所不同,我不会为您提供确切的解决方案,但会向您解释所有概念:

举个例子,假设您将背景和文本都作为 Bitmaps 对象,那么您的代码将是:

// Init our overlay bitmap
Bitmap bmp = backgroundBitmap.copy(Bitmap.Config.ARGB_8888, true);
// Init the canvas
Canvas canvas = new Canvas(bmp);
// Draw the text on top of the canvas
canvas.drawBitmap(textBitmap, 0, 0, null);

// now bmp have the two overlayed:

您可以(并且应该)做一些数学运算并使用drawBitmap()方法中的值 0, 0 将文本在画布上居中。

或者,如果您有一个可绘制对象(例如 getResources.getDrawable(R.drawable.bkgr); ),您可以使用draw() 方法绘制到画布并使用 getIntrinsicHeight 和 getIntrinsicWidth 使用此方法创建位图

快乐编码!

于 2013-04-02T11:10:08.927 回答
1

将布局更改为

<Framelayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="7" >

<ImageView
    android:id="@+id/imgSelectedPhoto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scaleType="fitXY" />

<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/txt_made_hawk_nelson"
    android:layout_centerInParent="true" />

设置 setDrawingCacheEnabled(true); 并从中创建位图。

Bitmap bitmap;
// frmCaptureThis is the root framelayout (this contains your imageviews)
View v1 = frmCaptureThis; 
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
saveImgToSDcard(bitmap); // function to saves the image to sd card
于 2013-04-02T11:10:11.707 回答
1

请试试这个,效果很好

BufferedImage img1 = ImageIO.read(new File(pathtoImage)); //first image
BufferedImage img2 = ImageIO.read(new File(pathtoOverlay)); //overlay text image
BufferedImage combinedImage = new BufferedImage(img1.getWidth(),img1.getHeight(),BufferedImage.TYPE_INT_RGB);

    Graphics g = combinedImage.getGraphics();

    g.drawImage(img1, 0, 0, null);
    g.drawImage(img2, 0, 0, null);
    ImageIO.write(combinedImage,"JPG",new File(pathToBeSaved,"combined.jpg");
于 2013-09-17T09:41:45.890 回答