Android Поворот изображения перед сохранением - PullRequest
11 голосов
/ 07 марта 2012

Я только что закончил работу с камерой, и она чудесным образом сохраняет данные.То, что я делаю после того, как фотография сделана:

protected void savePictureData() {
    try {
        FileOutputStream fs = new FileOutputStream(this.photo);
        fs.write(this.lastCamData);
        fs.close(); //okay, wonderful! file is just written to the sdcard

        //---------------------
        //---------------------
        //TODO in here: dont save just the file but ROTATE the image and then save it!
        //---------------------
        //---------------------


        Intent data = new Intent(); //just a simple intent returning some data...
        data.putExtra("picture_name", this.fname);
        data.putExtra("byte_data", this.lastCamData);
        this.setResult(SAVED_TOOK_PICTURE, data);
        this.finish(); 
    } catch (IOException e) {
        e.printStackTrace();
        this.IOError();
    }

}

То, что я хочу, уже как комментарий, приведенный в коде выше.Я не хочу, чтобы изображение было просто сохранено в файл, но должно быть повернуто, а затем сохранено!Спасибо!

// EDIT : что я сейчас делаю (работает, но все еще сталкивается с проблемами памяти с большими изображениями)

byte[] pictureBytes;
Bitmap thePicture = BitmapFactory.decodeByteArray(this.lastCamData, 0, this.lastCamData.length);
Matrix m = new Matrix();
m.postRotate(90);
thePicture = Bitmap.createBitmap(thePicture, 0, 0, thePicture.getWidth(), thePicture.getHeight(), m, true);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
thePicture.compress(CompressFormat.JPEG, 100, bos);
pictureBytes = bos.toByteArray();

FileOutputStream fs = new FileOutputStream(this.photo);
fs.write(pictureBytes);
fs.close();
Intent data = new Intent();
data.putExtra("picture_name", this.fname);
data.putExtra("byte_data", pictureBytes);
this.setResult(SAVED_TOOK_PICTURE, data);
this.finish();

Ответы [ 3 ]

20 голосов
/ 15 февраля 2013

Считайте путь с SD-карты и вставьте следующий код ... Он заменит существующую фотографию после ее поворота ..

Примечание: Exif не работает на большинстве устройств, он возвращаетневерные данные, поэтому рекомендуется жестко запрограммировать поворот перед сохранением в любой степени, которую вы хотите. Просто измените значение угла в postRotate.

    String photopath = tempphoto.getPath().toString();
    Bitmap bmp = BitmapFactory.decodeFile(photopath);

    Matrix matrix = new Matrix();
    matrix.postRotate(90);
    bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);

    FileOutputStream fOut;
    try {
        fOut = new FileOutputStream(tempphoto);
        bmp.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
        fOut.flush();
        fOut.close();

    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
4 голосов
/ 07 марта 2012

Перед созданием FileOutputStream вы можете создать новый Bitmap из оригинала, который был преобразован с помощью Matrix.Чтобы сделать это, вы должны использовать этот метод:

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

Где m определяет матрицу, которая будет транспонировать ваше исходное растровое изображение.

Для примера, как это сделать, посмотрите навопрос: Android: как повернуть растровое изображение в центральной точке

1 голос
/ 19 апреля 2018
bitmap = RotateBitmap(bitmap, 90);

public static Bitmap RotateBitmap(Bitmap source, float angle)
{
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...