2011-05-11 21 views
2

我想在Matlab中對數據庫中的某些圖像數據進行模擬。圖像數據來自java,作爲base64編碼的字節數組輸出。我不熟悉[java image]格式。但是,我寫了下面的基於一些與我一起工作的Java編寫的Matlab代碼。它們遵循相同的基本大綱,並且Java代碼能夠很好地讀取圖像。在Matlab代碼看起來是這樣的:Matlab:如何正確使用Java ImageIO類來獲取BufferedIMage

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空數組,而不是一個java BufferedImage實例。

我對dataStream進行了一些測試,看它是否按預期行事;排序沿線的一個小單元測試:

for jj = 1:10 
    for kk 1:10 
    assert(dataStream.read() == data(kk)); 
    end; 

    dataStream.reset(); 
end; 

它查出來,所以這讓我相信這個問題是ImageIO的或我使用它。

不幸的是,我沒有發現使用ImageIO(以及其他一些API)的例子,這些例子都以我在這裏概述的方式使用(在Matlab中)。

This code以相同的方式使用java.io.ByteArrayInputStream - 就所提供的數據是字節數組而言。

This code本質上是我想要做的 - 將java圖像轉換爲Matlab數組。不幸的是,他們通過採用Matlab圖像進行欺騙,將其轉換爲Java圖像,然後將其返回。

This code使用ImageIO,但它通過從文件流中讀取來實現。我嘗試將數據寫入文件,然後使用java.io.File讀取它,但是我得到的結果都是相同的。

所以,我不知所措。

+0

哪些數據,數據流,和BufferedImage的定義? – Marvo

+0

Matlab不是一種聲明性語言。代碼編寫的方式與我的評論相結合,將闡明它們代表的內容。數據是一個存儲爲int8數組的java圖像。我對格式不熟悉。如果你對Java很熟悉,那麼這可能會更明顯。問題是最後一行。直到dataStream產生的地步,所有的行爲都與此代碼的java版本相同。從流中讀取返回兩邊相同的數據。 ImageIO.read()在Matlab中無法正常工作,但我不確定原因。 –

回答

0

在提問中列出的方法工作。我有一個唯一從上面的代碼,我不加入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 linked to,萬一鏈接無效:

主題:我怎麼可以轉換一個「Java圖像」對象到MATLAB圖像 矩陣?

問題描述:IM2JAVA函數可用於將 的MATLAB圖像轉換爲Java圖像。我想將Java圖像 轉換爲MATLAB圖像。

解決方案:沒有內置功能將Java圖像轉換爲 MATLAB圖像。但是,使用Java API,您可以從Java圖像中提取數據 並將其存儲爲矩陣,即MATLAB的圖像 表示形式。

下面是將MATLAB圖像轉換爲Java並返回到MATLAB圖像的示例。本例中使用的圖像是MATLAB 演示程序的一部分,位於MATLAB路徑中。在本例中,Java類「Raster」的「getPixels」函數返回 圖像的RGB值。

根據您的Java映像的格式,額外的工作可能需要 。 Java圖像可以以多種格式之一存儲; 「getPixels」函數以該格式返回像素數據。欲瞭解更多 信息,請參閱java.awt.image.Raster的 類的Javadoc頁,http://java.sun.com/j2se/1.5.0/docs/api/java/awt/image/Raster.html

% create java image 
I = imread('office_3.jpg'); 
javaImage = im2java(I); 

% get image properties 
H=javaImage.getHeight; 
W=javaImage.getWidth; 

% repackage as a 3D array (MATLAB image format) 
B = uint8(zeros([H,W,3])); 
pixelsData = uint8(javaImage.getBufferedImage.getData.getPixels(0,0,W,H,[])); 
for i = 1 : H 
base = (i-1)*W*3+1; 
B(i,1:W,:) = deal(reshape(pixelsData(base:(base+3*W-1)),3,W)'); 
end 

% display image 
imshow(B); 

下面是另外兩種方式來實現這一點(更 優化的方式) :

實施例1:(更快的執行)

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))); 

實施例2:

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); 
+1

爲了完整起見,如果有人也想解決這個問題,MathWorks會給出[另一個解決方案](http://www.mathworks.com/support/solutions/en/data/1-2WPAYR/?solution=1- 2WPAYR)如何將BufferedImage轉換爲Matlab的uint8圖像。它還以正確的方向提供圖像(當我測試Brian Vandenberg的代碼時,圖像旋轉了90度)。 –

+0

::點::,我不需要擔心太多的方向,所以甚至沒有發生在我身上。 –

相關問題