Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java将Postgres中的图像检索到Matlab中?_Java_Sql_Database_Matlab_Image - Fatal编程技术网

如何使用Java将Postgres中的图像检索到Matlab中?

如何使用Java将Postgres中的图像检索到Matlab中?,java,sql,database,matlab,image,Java,Sql,Database,Matlab,Image,我被赋予了一个有点奇怪的任务,大约有1500-2000个jpeg图像,大小都在1-50kb左右。它们目前存储在我用Postgres创建的一个简单数据库中。我已经很久没有大量使用Matlab和Postgres了,所以非常感谢您的帮助和建议 我需要将存储在数据库中的图像从数据库中提取到Java中。最后一步是将图像从Java检索到Matlab中,这样图像的存储方式与imread函数在Matlab中的工作方式相同。imread函数读取中的图像,并创建表示RGB像素强度的uint8值的n×m×3矩阵阵列

我被赋予了一个有点奇怪的任务,大约有1500-2000个jpeg图像,大小都在1-50kb左右。它们目前存储在我用Postgres创建的一个简单数据库中。我已经很久没有大量使用Matlab和Postgres了,所以非常感谢您的帮助和建议

我需要将存储在数据库中的图像从数据库中提取到Java中。最后一步是将图像从Java检索到Matlab中,这样图像的存储方式与imread函数在Matlab中的工作方式相同。imread函数读取中的图像,并创建表示RGB像素强度的uint8值的n×m×3矩阵阵列

Atm我已经用Java在数据库中输入和输出了图像,目前将图像存储在bytea列数据类型中。使用的最佳数据类型是什么

如何从数据库中获取数据,使其成为我放入的构造jpeg图像,或者是请求的矩阵数组格式

目前我不理解检索到的数据。它位于一个大约70000个元素的字节数组中,包含-128到128之间的值。救命

注意:数据库工具包对我不可用

另一个更新:我已经解决了与“UTF-8”编码错误相关的问题


如果有人无意中发现了这个页面,我会尽快尝试发布任何答案!我真的很感激你的想法和回答。再次感谢。

您是否可以访问MATLAB中的?如果是这样,您应该能够使用函数直接连接到PostgreSQL数据库,然后使用函数或GUI导入和导出数据。这可能比第一次使用Java更容易。

当你说你在bytea列中有图像时,它到底是如何存储的?它是存储JPEG文件内容的字节,还是存储RGB像素值数组,还是存储其他内容?“Bytea”只是一个二进制字符串,它可以以几乎任何格式存储数据

我假设是JPEG内容。在这种情况下,您可以通过Java检索jpeg内容,将其保存到临时文件中,然后对临时文件调用imread()

这些[-128127]值是有符号字节的值。即使没有数据库工具箱,也可以调用常规JDBC或使用它的其他Java代码。用于获取这些值的Java方法—从Matlab调用它(JAR位于类路径上),它应该将该数组作为int8数组返回,或者可以将其转换为一个数组

假设在一个名为“bytes”的Matlab变量中,您可以使用类似这样的内容将其写入一个临时文件

file = [tempname() '.jpg'];
fid = fopen(file, 'wb');
fwrite(fid, bytes, 'int8');
fclose(fid);
通过指定“int8”精度,我认为您可以跳过将它们转换为无符号字节的步骤,这是一种更常见的约定。将int8s写入“int8”或将uint8s写入“uint8”将生成相同的文件。如果确实需要将它们转换为无符号,请使用Matlab的typecast()函数

unsigned_bytes = typecast(bytes, 'uint8');
此时,您可以对临时文件调用imread,然后将其删除

img = imread(file);
delete(file);
已解决问题:-)

我已经设法将数据库中bytea列中存储的字节放入字节数组中。然后通过创建一个临时文件(使用ByteArrayInputStream和Reader对象形成一个BuffereImage对象,我将其写入文件),将其以数组形式发送回Matlab

然后在Matlab中处理从临时文件中检索和读取的数据。一旦数据在Matlab中,所有临时文件都将被删除

处理结果集以从databases 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 
        }

    }
private static void processImageResultSet(ResultSet rs)抛出SQLException、FileNotFoundException、IOException{
int i=0;//用作计数并命名各种临时文件
while(rs.next()){//遍历结果集
byte[]b=rs.getBytes(1);//bytea列结果
String location=getFileName(rs.getString(2));//jpg文件的名称
ByteArrayInputStream bis=新的ByteArrayInputStream(b);//创建存储byts的流
//要使临时文件的各个名称唯一,将存储当前时间和日期
SimpleDataFormat df=新的SimpleDataFormat('Date'yyyy MM dd HH'H'-MM'M'-ss'secs'-ss'ms');//格式化日期字符串
Calendar cal=Calendar.getInstance();//获取日历时间的实例
String fileDate=df.format(cal.getTime());//以字符串形式获取时间和日期
迭代器readers=ImageIO.getImageReadersByFormatName(“jpg”);//创建一个读卡器对象,该对象将读取jpg编解码器压缩格式
Object source=bis;//用于存储数据库中字节流的对象
ImageReader=(ImageReader)readers.next();
ImageInputStream iis=ImageIO.CreateMageInputStream(源);//从存储字节流的对象源创建图像输入流
reader.setInput(iis,true);//将reader对象设置为读取图像输入流
ImageReadParam param=reader.getDefaultReadParam();
Image=reader.read(0,参数);
BuffereImage BuffereImage=new BuffereImage(image.getWidth(null)、image.getHeight(null)、buffereImage.TYPE_INT_RGB);//创建缓冲图像
Graphics2D g2=buffereImage.createGraphics();
g2.drawImage(图像,空,空);
File imageFile=新文件(位置+“”+fileDate+“”+i+“.jpg”);//创建图像文件
write(bufferedImage,“jpg”,imageFile);//将缓冲的图像对象写入创建的文件
i++;//统计ResultSet中查询的结果数
}
}

否,数据库工具箱不可用