Как получить изображения в Postgres в Matlab с помощью Java? - PullRequest
0 голосов
/ 07 августа 2009

Мне дали немного странное задание, есть около 1500-2000 изображений в формате JPEG размером всего 1-50 КБ. В настоящее время они хранятся в простой базе данных, которую я создал с помощью Postgres. Прошло много времени с тех пор, как я интенсивно использовал Matlab и Postgres, поэтому любая помощь или предложения действительно приветствуются!

Мне нужно получить изображения, которые хранятся в базе данных, из базы данных в Java. Последний шаг - получение изображения из Java в Matlab, чтобы изображение сохранялось так же, как функция imread работает в Matlab. Функция imread считывает изображение и создает матричный массив размером n на m на 3 из значений uint8, которые обозначают интенсивность пикселей RGB.

Atm Я получил изображение в базе данных на Java и из нее, в настоящее время храня изображение в виде данных столбца bytea. Лучший тип данных для использования?

Как я могу получить данные обратно из базы данных, чтобы это было либо встроенное изображение JPEG, которое я вставил, либо в требуемом формате матричного массива?

В настоящее время я не понимаю восстановленные данные. Он находится в байтовом массиве из примерно 70000 элементов, содержащих значения в диапазоне от -128 до 128. Справка!?!

Примечание: мне недоступен инструментарий базы данных

ДРУГОЕ ОБНОВЛЕНИЕ: Я решил проблему, связанную с post относительно ошибки кодирования 'UTF-8'.

Если кто-нибудь наткнется на эту страницу, любой опубликованный ответ будет проверен, как только я смогу! Я действительно ценю ваши мысли и ответы. Еще раз спасибо.

Ответы [ 3 ]

1 голос
/ 10 августа 2009

Когда вы говорите, что у вас есть изображение в столбце bytea, как именно оно сохраняется? Хранит ли это байты содержимого файла JPEG, или массив значений пикселей RGB, или что-то еще? «Bytea» - это просто двоичная строка, которая может хранить данные практически в любом формате.

Я предполагаю, что это содержимое JPEG. В этом случае вы можете извлечь содержимое jpeg через Java, сохранить его во временный файл и вызвать imread () для временного файла.

Эти [-128,127] значения являются значениями байтов со знаком Java. Даже без Database Toolbox вы можете вызывать обычный JDBC или другой Java-код, который его использует. Java-метод, который вы использовали для получения этих значений - вызывайте его из Matlab (с вашим JAR на пути к классам), и он должен возвращать этот массив в виде массива int8 или чего-то, что вы можете преобразовать в один.

Учитывая, что в переменной Matlab с именем "bytes" вы можете записать ее во временный файл с чем-то вроде этого.

file = [tempname() '.jpg'];
fid = fopen(file, 'wb');
fwrite(fid, bytes, 'int8');
fclose(fid);

Задавая точность 'int8', я думаю, что вы можете пропустить этап преобразования их в байты без знака, что является более распространенным соглашением. Запись int8s как 'int8' или uint8s как 'uint8' даст тот же файл. Если вам нужно преобразовать их в unsigned, используйте функцию tylabast () Matlab.

unsigned_bytes = typecast(bytes, 'uint8');

В этот момент вы можете вызвать imread для временного файла и затем удалить его.

img = imread(file);
delete(file);
1 голос
/ 17 августа 2009

Проблема решена: -)

Мне удалось получить байты, хранящиеся в столбце bytea в базе данных, в байтовый массив. Затем, создав временный файл (используя объекты ByteArrayInputStream и Reader для формирования объекта BufferedImage, который я записываю в файл), отправьте его обратно в Matlab в массиве.

Затем обработайте данные, которые я извлек, и прочитайте из временного файла в Matlab. Когда данные находятся в Matlab, все временные файлы удаляются.

Код для обработки ResultSet для создания временного изображения из байтового массива, полученного из столбца bytea базы данных, показан ниже:

private static void processImageResultSet(ResultSet rs) throws SQLException, FileNotFoundException, IOException{

        int i = 0;                  //used as a count and to name various temp files
        while(rs.next()){           //loop through result sets

        byte[] b = rs.getBytes(1);                                 //the bytea column result
        String location = getFileName(rs.getString(2));            //the name of the jpg file
        ByteArrayInputStream bis = new ByteArrayInputStream(b);    //creates stream storing byts

        //To make individual names of temporary files unique the current time and date is stored
        SimpleDateFormat df = new SimpleDateFormat("'Date 'yyyy-MM-dd HH'H'-mm'M'-ss'secs'-SS'ms'"); //formats date string
        Calendar cal = Calendar.getInstance();                                //gets instance of calendar time
        String fileDate = df.format(cal.getTime());                           //gets the time and date as a String

        Iterator<?> readers = ImageIO.getImageReadersByFormatName("jpg");     //creates a reader object, that will read jpg codec compression format
        Object source = bis;                                                  //object to store stream of bytes from database
        ImageReader reader = (ImageReader) readers.next();                      
        ImageInputStream iis = ImageIO.createImageInputStream(source);        //creates image input stream from object source which stores byte stream

        reader.setInput(iis, true);             //sets the reader object to read image input stream

        ImageReadParam param = reader.getDefaultReadParam(); 
        Image image = reader.read(0, param);

        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);   //creates buffered image

        Graphics2D g2 = bufferedImage.createGraphics();
        g2.drawImage(image, null, null);
        File imageFile = new File(location + " " + fileDate + " " + i + ".jpg"); //creates image file 
        ImageIO.write(bufferedImage, "jpg", imageFile);                          //writes buffered image object to created file

        i++;        //counts number of results from query within the ResultSet 
        }

    }
0 голосов
/ 07 августа 2009

Есть ли у вас доступ к Database Toolbox в MATLAB? Если это так, вы сможете напрямую подключиться к базе данных PostgreSQL с помощью функции DATABASE , а затем импортировать и экспортировать данные с помощью функции FETCH или QUERYBUILDER GUI , Это может быть проще, чем сначала пройти через Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...