【问题标题】:Android - Rotated text on a large bitmapAndroid - 大位图上的旋转文本
【发布时间】:2011-07-02 01:25:14
【问题描述】:

我有一张图片(位图),我想绘制一些形状并旋转 上面有文字。

只要图片不会太大,它就可以正常工作。然而, 使用内置照片(2560 x 1920 像素)拍摄时 我的 android 2.1 手机的相机,结果失真。 在绘制旋转后的文本后,看起来旋转回来了 没有完成。此外,失真点并不总是相同的, 喜欢它取决于cpu的使用情况。

你可以在这里看到一些结果图片:
http://dl.dropbox.com/u/4751612/Result1.png
http://dl.dropbox.com/u/4751612/Result2.png

代码在 AsyncTask 中执行。奇怪的是,这段代码在一个 Activity 中运行良好,但在另一个 Activity 中却不行。在这两个活动中,单击按钮时都会执行 AsyncTask。

这些是我正在使用的代码的一些摘录。

// Load the image from the MediaStore
c = MediaStore.Images.Media.query(context.getContentResolver(),
Uri.parse(drawing.fullImage), new String[] {MediaColumns.DATA});
if (c != null && c.moveToFirst()) {
       imageFilePath = c.getString(0);
       bitmap = ImageUtil.getBitmap(new File(imageFilePath), 10000);
}
c.close();

// Create a canvas to draw on
drawingBitmap = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(drawingBitmap);

// Draw image
canvas.drawBitmap(bitmap, 0, 0,
MeasureFactory.getMeasurePaint(context));

// calculate text width
rect = new Rect();
paint.getTextBounds(text, 0, text.length(), rect);

// Draw rotated text
canvas.save();
canvas.rotate(-angle, centerPoint.x, centerPoint.y);
canvas.drawText(text, centerPoint.x-Math.abs(rect.exactCenterX()),
Math.abs(centerPoint.y-rect.exactCenterY()), paint);
canvas.restore();

// Upload the bitmap to the Media Library
Uri uri =
getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values);
OutputStream outStream = getContentResolver().openOutputStream(uri);
drawingBitmap.compress(Bitmap.CompressFormat.JPEG, 90, outStream);
outStream.flush();
outStream.close();

提前感谢您的帮助。

【问题讨论】:

  • Canvas.rotate() 实际上并不旋转画布中已有的位图……它只会影响后续的绘图操作。
  • 我不知道。感谢您的澄清。

标签: android text bitmap rotation mediastore


【解决方案1】:

只要分辨率不太高,它就可以工作,我只会将所有图像重新缩放为可以工作的东西。

您可以使用
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 800 /* width */, 600 /* height */, true);

完成此操作

【讨论】:

    【解决方案2】:

    这被证明是内存问题,尽管日志中没有出现 OutOfMemoryException。

    所以,如果分辨率太高,我通过缩放图像来“解决”它,正如 ingo 所建议的那样。问题是我不知道如何确定设备的限制。我想它们对于每个设备都是不同的,并且取决于当前的内存使用情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多