Android - повернутый текст на большом растровом изображении - PullRequest
1 голос
/ 22 февраля 2011

У меня есть изображение (растровое изображение), и я хочу нарисовать на нем несколько фигур и повернутый текст.

Это работает нормально, если изображение не становится слишком большим.Однако при использовании изображения (2560 x 1920 пикселей), сделанного встроенной камерой моего телефона с Android 2.1, результат искажается.Похоже, что вращение назад после рисования повернутого текста не было завершено.Кроме того, точка искажения не всегда одинакова, так как она зависит от использования процессора.

Здесь вы можете увидеть некоторые получающиеся изображения:http://dl.dropbox.com/u/4751612/Result1.pnghttp://dl.dropbox.com/u/4751612/Result2.png

Код выполняется внутри AsyncTask.Странно то, что этот код прекрасно работает в одном действии, но не в другом.В обоих действиях 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();

Заранее благодарен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

Это оказалось проблемой с памятью, хотя в журнале не было видно исключения OutOfMemoryException.

Итак, я «решил» это путем масштабирования изображения, если разрешение слишком высокое, как предложено ingo.Проблема в том, что я не знаю, как определить пределы устройства.Я предполагаю, что они различны для каждого устройства и зависят от текущего использования памяти.

0 голосов
/ 23 февраля 2011

Поскольку он работает до тех пор, пока разрешение не слишком высокое, я просто изменил бы масштабирование всех изображений на что-то, что работает.

Вы можете сделать это, используя
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 800 /* width */, 600 /* height */, true);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...