Перевернутое изображение, хранящееся в виде массива byte[]

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

Я искал вокруг и не могу найти простое решение без манипулирования каждым битом в массиве byte[].

Как насчет преобразования массива байтов [] в какой-либо тип изображения, переворачивания его с помощью существующего метода переворота, а затем преобразования его обратно в массив байтов []?

Любой совет?

Ваше здоровье!


person LKB    schedule 05.06.2013    source источник
comment
Что вы имеете в виду под флипом?   -  person fge    schedule 06.06.2013
comment
Поверните изображение, чтобы оно превратилось из перевернутого изображения в вертикальное.   -  person LKB    schedule 06.06.2013
comment
What about converting the byte array[] to an image type of some sort, flipping that using an existing flip method, and then converting that back to a byte[] array? Да. Преобразование в растровое изображение, поворот, затем преобразование обратно в массив.   -  person Voicu    schedule 06.06.2013
comment
Спасибо @Voicu, вы знаете, как лучше всего преобразовать массив byte[] в Bitmap?   -  person LKB    schedule 06.06.2013
comment
Добавил ответ с некоторым кодом.   -  person Voicu    schedule 06.06.2013


Ответы (2)


Массив байтов в растровое изображение:

Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

Используйте это, чтобы повернуть изображение, указав правильный угол (180):

public Bitmap rotateImage(int angle, Bitmap bitmapSrc) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(bitmapSrc, 0, 0, 
        bitmapSrc.getWidth(), bitmapSrc.getHeight(), matrix, true);
}

Затем вернитесь к массиву:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] flippedImageByteArray = stream.toByteArray();
person Voicu    schedule 05.06.2013
comment
Мое изображение в формате Gray8, процесс преобразования из байтового массива в Bitmap и обратно не должен влиять на формат, верно? Большое спасибо за Вашу помощь. :) - person LKB; 06.06.2013
comment
Eek, NullPointerException при возврате растрового изображения - return Bitmap.createBitmap(bitmapSource, 0, 0, bitmapSource.getWidth(), bitmapSource.getHeight(), matrix, true); - person LKB; 06.06.2013
comment
Скорее всего, вы отправили нулевую ссылку на метод rotateImage, потому что на этом первом шаге изображение не удалось декодировать в метод Bitmap. - person Voicu; 06.06.2013
comment
Скорее всего, виноват формат Gray8. Есть ли шанс преобразовать эти изображения в формат PNG/JPEG/GIF? - person Voicu; 06.06.2013
comment
Да, я вставил массив байтов в код преобразования Bitmap до того, как мой массив байтов будет преобразован в формат gray8, и он работает. :) - person LKB; 06.06.2013
comment
Не следует расшифровывать изображение. Почему? потому что у вас может закончиться память, и поэтому вам нужно будет уменьшить изображение при декодировании. Затем вы переворачиваете уменьшенное изображение. Так что конечный результат правильно перевернут, но разрешение дерьмовое. - person Matthias; 07.08.2014

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

private byte[] flipImage(byte[] data, int flip) {
    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
    Matrix matrix = new Matrix();
    switch (flip){
        case 1: matrix.preScale(1.0f, -1.0f); break; //flip vertical
        case 2: matrix.preScale(-1.0f, 1.0f); break; //flip horizontal
        default: matrix.preScale(1.0f, 1.0f); //No flip
    }

    Bitmap bmp2 = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp2.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    return stream.toByteArray();
}

Если вы хотите, чтобы изображение было перевернуто по вертикали, передайте 1 в качестве значения отражения, а для отражения по горизонтали — 2.

Например:

@Override
public void onPictureTaken(byte[] data, Camera camera) {
   byte[] verticalFlippedImage = flipImage(data,1);
   byte[] horizontalFlippedImage = flipImage(data,2);
}
person Codemaker    schedule 01.04.2021