我正在尝试在 Matlab 中对数据库中的一些图像数据进行模拟。图像数据来自 java,输出为 base64 编码的字节数组。我不熟悉 [java image] 格式。但是,我根据与我一起工作的人编写的一些 java 编写了以下 Matlab 代码。它们遵循相同的基本轮廓,Java 代码能够很好地读取图像。Matlab 代码如下所示:
function [ result ] = queryDb( theQuery )
conn = database( ... ); % connect to the database
result = fetch( exec( conn, theQuery ) );
result = result.Data;
close( conn );
end
data = queryDb( 'sql query to get the data' );
data = uint8( data{1,1} );
data = org.apache.commons.codec.binary.Base64.decodeBase64( data );
data = uint8( 127 + data ); % the base64 decoder returns signed int8
import javax.imageio.ImageIO;
import java.io.ByteArrayInputStream;
dataStream = ByteArrayInputStream( data );
bufferedimage = ImageIO.read( dataStream );
经检查bufferedimage
,它是一个空数组,double
而不是 javaBufferedImage
实例。
我进行了一些测试dataStream
,看看它是否符合预期;类似于以下内容的迷你单元测试:
for jj = 1:10
for kk 1:10
assert( dataStream.read() == data(kk) );
end;
dataStream.reset();
end;
它检查了,所以这让我相信问题出在 ImageIO 或我对它的使用上。
不幸的是,我发现的使用 ImageIO(以及其中一些其他 API)的示例都没有以我在此处概述的方式(即在 Matlab 中)使用。
此代码以java.io.ByteArrayInputStream
相同的方式使用——从某种意义上说,提供的数据是一个字节数组。
这段代码本质上就是我想要做的——将 java 图像转换为 Matlab 数组。不幸的是,他们通过获取 Matlab 图像,将其转换为 java 图像,然后将其转回来作弊。
此代码使用 ImageIO,但它是通过从文件流中读取来实现的。我尝试将数据写入文件然后在 using 中读取它java.io.File
,但无论哪种方式我都得到相同的结果。
所以,我很茫然。