Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Matlab:如何正确使用Java ImageIO类获取BuffereImage_Java_Matlab_Javax.imageio - Fatal编程技术网

Matlab:如何正确使用Java ImageIO类获取BuffereImage

Matlab:如何正确使用Java ImageIO类获取BuffereImage,java,matlab,javax.imageio,Java,Matlab,Javax.imageio,我试图在Matlab中对数据库中的一些图像数据进行模拟。图像数据来自java,输出为base64编码字节数组。我不熟悉[java图像]格式。然而,我基于与我一起工作的人编写的一些java编写了以下Matlab代码。它们遵循相同的基本轮廓,Java代码能够很好地读取图像。Matlab代码如下所示: function [ result ] = queryDb( theQuery ) conn = database( ... ); % connect to the database res

我试图在Matlab中对数据库中的一些图像数据进行模拟。图像数据来自java,输出为base64编码字节数组。我不熟悉[java图像]格式。然而,我基于与我一起工作的人编写的一些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 );
在检查
buffereImage
时,它是一个
double
的空数组,而不是java
buffereImage
实例

我在
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,但它是通过读取文件流来实现的。我尝试将数据写入一个文件,然后使用
java.io.file
将其读入,但无论采用哪种方法,结果都是一样的


所以,我不知所措。

问题中概述的方法有效。。。我与上面代码的唯一不同之处在于,我没有将127添加到uint8数组中:

% Do all the imports
% sql query to get the data
dataStream    = ByteArrayInputStream( decodeBase64( rows.data{1} ) );
bufferedImage = ImageIO.read( dataStream );
[w h] = deal( theWidth, theHeight );
imageData     = uint8( bufferedImage.getData.getPixels( 0,0,w,h,[] ) );
imageData     = permute( reshape( imageData, [3 w h] ), [2 3 1] );

imshow( imageData );
% voila

在链接无效的情况下,编辑包含文本@kchja的内容:

主题:如何将“Java图像”对象转换为MATLAB图像 矩阵

问题描述:IM2JAVA函数可用于转换 将MATLAB图像转换为Java图像。我想转换一个Java图像 到一个MATLAB图像

解决方案:没有内置函数将Java图像转换为 MATLAB图像。但是,使用JavaAPI可以提取数据 从Java图像中提取并存储为矩阵,这是MATLAB的图像 代表性

下面是一个将MATLAB图像转换为Java并返回到 MATLAB图像。本例中使用的图像是MATLAB的一部分 演示并在MATLAB路径上。在本例中,“getPixels” Java类“Raster”的函数返回 形象

根据Java映像的格式,可能需要额外的工作 必修的。Java图像可以以多种格式之一存储;这个 “getPixels”函数返回该格式的像素数据。更多 有关详细信息,请参阅java.awt.image.Raster类的javadoc页面 在

以下是实现这一点的两种其他方法(以更简单的方式) 优化方式):

示例1:(执行速度更快)

例2:


问题中概述的方法有效。。。我与上面代码的唯一不同之处在于,我没有将127添加到uint8数组中:

% Do all the imports
% sql query to get the data
dataStream    = ByteArrayInputStream( decodeBase64( rows.data{1} ) );
bufferedImage = ImageIO.read( dataStream );
[w h] = deal( theWidth, theHeight );
imageData     = uint8( bufferedImage.getData.getPixels( 0,0,w,h,[] ) );
imageData     = permute( reshape( imageData, [3 w h] ), [2 3 1] );

imshow( imageData );
% voila

在链接无效的情况下,编辑包含文本@kchja的内容:

主题:如何将“Java图像”对象转换为MATLAB图像 矩阵

问题描述:IM2JAVA函数可用于转换 将MATLAB图像转换为Java图像。我想转换一个Java图像 到一个MATLAB图像

解决方案:没有内置函数将Java图像转换为 MATLAB图像。但是,使用JavaAPI可以提取数据 从Java图像中提取并存储为矩阵,这是MATLAB的图像 代表性

下面是一个将MATLAB图像转换为Java并返回到 MATLAB图像。本例中使用的图像是MATLAB的一部分 演示并在MATLAB路径上。在本例中,“getPixels” Java类“Raster”的函数返回 形象

根据Java映像的格式,可能需要额外的工作 必修的。Java图像可以以多种格式之一存储;这个 “getPixels”函数返回该格式的像素数据。更多 有关详细信息,请参阅java.awt.image.Raster类的javadoc页面 在

以下是实现这一点的两种其他方法(以更简单的方式) 优化方式):

示例1:(执行速度更快)

例2:


数据、数据流和缓冲图像的定义是什么?Matlab不是一种声明性语言。代码的编写方式,再加上我的评论,将详细说明它们所代表的内容。数据是存储为int8数组的java映像。我对格式不熟悉。如果您对Java足够熟悉,那么这一点可能会更加明显。问题是最后一行。在dataStream出现之前,所有的行为都与该代码的java版本相同。从流中读取会在每一侧返回相同的数据。但是,ImageIO.read()在Matlab中无法正常工作,我不确定原因。数据、数据流和BuffereImage的定义是什么?Matlab不是一种声明性语言。代码的编写方式,再加上我的评论,将详细说明它们所代表的内容。数据是存储为int8数组的java映像。我对格式不熟悉。如果您对Java足够熟悉,那么这一点可能会更加明显。问题是最后一行。在dataStream出现之前,所有的行为都与该代码的java版本相同。从流中读取会在每一侧返回相同的数据。但是,ImageIO.read()在Matlab中不能正常工作,我不确定为什么。为了完整起见,如果有人也要解决这个问题,MathWorks给出了如何将BuffereImage转换为
pixelsData = reshape(typecast(jImage.getData.getDataStorage, 'uint8'), 4, w, h);
imgData = cat(3, ...
        transpose(reshape(pixelsData(3, :, :), w, h)), ...
        transpose(reshape(pixelsData(2, :, :), w, h)), ...
        transpose(reshape(pixelsData(1, :, :), w, h)));
imgData = zeros([H,W,3],'uint8');
pixelsData = reshape(typecast(javaImage.getBufferedImage.getData.getDataStorage,'uint32'),W,H).';
imgData(:,:,3) = bitshift(bitand(pixelsData,256^1-1),-8*0);
imgData(:,:,2) = bitshift(bitand(pixelsData,256^2-1),-8*1);
imgData(:,:,1) = bitshift(bitand(pixelsData,256^3-1),-8*2);