Я пишу текст на изображении, которое будет сжато.
Изображение sie 2048 x 1536
Что-то px
Сначала я попытался сначала написать. Он выдает исключение OutOfMemory Exception
затем я сначала сжал его до 1024 x 768
Затем напишите текст на изображении
Количество КБ изображения увеличилось с 100KB
до 640KB
.
Во время написания текста я могу compromise
Image quality but not the text Quality
при качестве сжатия, установленном на 30
, текст также становится downsample
Вопросы:
есть ли какой-либо процесс для текста
write then compress
илиCompress then Write
без изменения размера изображения (в КБ)?Я хочу, чтобы размер изображения (в КБ) был как можно меньше?
А также, когда для inSampleSize установлено значение 3, оно не работает, и в качестве вывода создается только изображение 2048, 1024, 512 с использованием 1, 2, 4. Мне нужно изображение некоторого размера около 700 пикселей с сохранением соотношения сторон.
Коды:.
Метод штамповки изображения
public void stampMyImage(String filePath, String text, Bitmap bitmap) {
String[] str = text.split("\n");
filePath = "/sdcard/geoTag/1imagelong_001_001_0002_0002_1135_130708144229.jpg";
bitmap = BitmapFactory.decodeFile(filePath);
if (bitmap != null) {
Bitmap dest = null;
try {
dest = bitmap.copy(bitmap.getConfig(), true);
} catch (OutOfMemoryError e1) {
Log.e("Exception", e1.getMessage());
e1.printStackTrace();
} catch (Error e) {
Log.e("Exception", e.getMessage());
e.printStackTrace();
}
Canvas cs = new Canvas(dest);
Typeface tf = Typeface.create("Verdana", Typeface.BOLD);
Paint tPaint = new Paint();
tPaint.setAntiAlias(true);
tPaint.setTextSize(40);
tPaint.setTextAlign(Align.LEFT);
tPaint.setTypeface(tf);
tPaint.setColor(Color.RED);
tPaint.setStyle(Style.FILL_AND_STROKE);
cs.drawBitmap(bitmap, 0f, 0f, null);
float textHeight = tPaint.measureText("yY");
int index = 0;
for (String Oneline : str) {
cs.drawText(Oneline, 20f, (index + 1) * textHeight + 25f,
tPaint);
index++;
}
try {
FileOutputStream fos = new FileOutputStream(
"/sdcard/timeStampedImage.jpg");
dest.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
Метод регулярного сжатия
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
int quality = 70;
myBitmapClose = BitmapFactory.decodeFile(imgUriClose.getPath(),options);
if (myBitmapClose != null) {
File sdImageMainDirectory = new File(imgUriClose.getPath());
try {
FileOutputStream fileOutputStream = new FileOutputStream(sdImageMainDirectory);
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
myBitmapClose.compress(CompressFormat.JPEG, quality, bos);
if (bos != null) {
bos.flush();
bos.close();
}
if (fileOutputStream != null) {
fileOutputStream.flush();
fileOutputStream.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Пример изображения
См. также
Некоторые полезные ссылки, которые я перешел
Как написать текст на изображении в Java (Android)
Создание изображения с пользовательским текстом в Android
Рисование текста (TimeStamp) поверх изображения, снятого с автономной камеры