Написать текст на изображении без увеличения размера?

Я пишу текст на изображении, которое будет сжато.

Изображение sie 2048 x 1536 Что-то px

Сначала я попытался сначала написать. Он выдает исключение OutOfMemory Exception

затем я сначала сжал его до 1024 x 768

Затем напишите текст на изображении

Количество КБ изображения увеличилось с 100KB до 640KB.

Во время написания текста я могу compromise Image quality but not the text Quality

при качестве сжатия, установленном на 30, текст также становится downsample

Вопросы:

  1. есть ли какой-либо процесс для текста write then compress или Compress then Write
    без изменения размера изображения (в КБ)?

  2. Я хочу, чтобы размер изображения (в КБ) был как можно меньше?

  3. А также, когда для 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) поверх изображения, снятого с автономной камеры


person Community    schedule 09.07.2013    source источник
comment
Вам действительно нужно сохранить текст как часть изображения? Я бы сохранил описание изображения в виде текста и байты из изображения в один файл. Затем каждый раз, когда вы хотите отобразить, вы читаете оба, и текст может отображаться на любом экране.   -  person PedroAGSantos    schedule 09.07.2013
comment
Что я могу сделать, братан, вся информация уже готова в базе данных, но мой босс хочет этого, так что я могу сделать, да, я хочу сделать именно то, что я написал, я уже отображаю, используя изображение в фоновом режиме div в Интернете, отправленном через мобильный телефон   -  person Trikaldarshiii    schedule 09.07.2013


Ответы (1)


Ваша проблема заключается в допустимом распределении памяти для вашего приложения. Когда вы загружаете изображения в растровые переменные (decodeFile или bitmap.copy), попробуйте установить параметры для снижения качества изображения. Например, когда вы делаете bitmap.copy, попробуйте установить такие параметры:

bitmap.copy(Bitmap.Config.ARGB_4444, true);
person red_alert    schedule 09.07.2013
comment
Та же ошибка, которую я уже пробовал, поэтому я пошел с bitmap.getConfig() - person Trikaldarshiii; 09.07.2013
comment
Основная проблема в том, что я должен сжать его, и сначала написать и сжать, слишком много вещей, которые все пишут одинаково, может быть, какой-то метод для линейного поведения. - person Trikaldarshiii; 09.07.2013