Преобразование Mat в byte[] и обратно

139
22 сентября 2019, 14:30

Необходимо получить класс Mat, провести с ним манипуляции и сохранить в byte[], с последующим восстановлением byte[] в Mat.
Написал простейший пример:

    public class App {
        public static void main(String[] args) {
            try (InputStream inputStream = App.class.getResourceAsStream("/little-image.png")) {
                byte[] bytes = new byte[inputStream.available()];
                inputStream.read(bytes);
                //Первое получение Mat
                Mat mat = Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.IMREAD_UNCHANGED);
                System.out.println(mat);
                if (mat.empty()) {
                    System.out.println("empty");
                } else {
                    System.out.println("TYPE: " + CvType.typeToString(mat.type())); //Не пусто
                }
                //Копируем
                byte[] testImg = new byte[mat.cols() * mat.rows() * mat.channels()];
                int count = mat.get(0, 0, testImg);
                System.out.println("count: " + count);
                System.out.println("testImg.length: " + testImg.length);
                //Получаем из скопированного
                Mat mat1 = Imgcodecs.imdecode(new MatOfByte(testImg), Imgcodecs.IMREAD_ANYDEPTH);
                System.out.println(mat1);
                if (mat1.empty()) {
                    System.out.println("empty"); //!!!!!!!!!!!!ПУСТО!
                } else {
                    System.out.println("TYPE: " + CvType.typeToString(mat1.type()));
                }
                mat.release();
                mat1.release();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }  

Восстановление Mat из byte[] возвращает пустой Mat.

Answer 1

Так у Вас testImg пустой. Вы лишь инициализируете массив байт заданной длины, но ничем его не заполняете. По-умолчанию весь массив при инициализации заполняется нулями.

Answer 2

Решение:

MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".png", mat, matOfByte);
byte[] bytes1 = matOfByte.toArray();
READ ALSO
UnixException on Mac

UnixException on Mac

Начал получить ошибку на Mac при попытке записать pdf файл в папку tempВернее, приложение должно записывать туда файл, но не записывает (исключения...

135
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1 at Main.main(Main.java:15) Why?

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1 at Main.main(Main.java:15) Why?

Если я в 15 строке заменяю на простое, обыкновенное число (не digitnextInt()), то все работает по плану!

134
Версионирование API Spring

Версионирование API Spring

У меня есть старый контроллер, который обслуживает все запросы по адресу /get, то есть на уровне класса стоит аннотация @RequestMapping(value = "get")

183
Передача атрибутов из цикла Thymeleaf

Передача атрибутов из цикла Thymeleaf

Имеется контроллер, который выводит все департаментыВ html с помощью th:each Я вывожу их все

133