Поворот файла изображения без изменения размера файла

1

Я хочу повернуть файл изображения (фотографию) без изменения размера файла:

  • Я создаю растровое изображение с Bitmap.decodeFile
  • Я применяю поворот:

    Matrix matrix = new Matrix();
    matrix.postRotate(90);
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    
  • Я сохраняю растровое изображение в файле с помощью

    bitmap.compress(CompressFormat.JPEG, 100, stream);
    

но размер моего исходного файла удвоился!

Теги:
image
rotation

2 ответа

4

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

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

  • 0
    оригинальный формат файла JPEG без сжатия (высокое качество)
  • 2
    @Arutha: Даже JPEG максимального качества имеет некоторую степень сжатия.
0

Помимо формата сжатия, попробуйте создать битмап с тем же конфигом, что и изображение src. Я бы предложил RGB_565: http://developer.android.com/reference/android/graphics/Bitmap.Config.html

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

mCanvas = new Canvas();
mBitmap = Bitmap.createBitmap(this.width, this.height,
    Bitmap.Config.RGB_565);
mCanvas.setBitmap(mBitmap);

Теперь, если вы представляете какой-либо мысли mCanvas, он будет сохранен в растровом изображении:

mCanvas.save();
mCanvas.translate or roate
mCanvas.drawBitmap(<your real bitmap here>)
mCanvas.restore();

Теперь mBitmap должен иметь все, что вам нужно (и размер).

  • 1
    хорошо, но нет синтаксиса Bitmap.createBitmap, который принимает параметры Config и Matrix.
  • 0
    Вы можете попытаться создать холст с этим растровым изображением, а затем отобразить свое настоящее растровое изображение на холсте, но с использованием этого перевода. Затем вы должны повернуть изображение, но в растровом изображении с правильным конфигом. Я добавил код в мой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню