2013-09-06 3 views
6

Ho un'applicazione in tempo reale che riceve immagini jpg codificate in base64. Non so come mostrare l'immagine in MATLAB senza dover salvare l'immagine sul disco e aprirla in seguito.Da bit grezzi a jpeg senza scrittura in un file

Questo è il codice che ho finora, che salva l'immagine nel disco prima di mostrarlo:

raw = base64decode(imageBase64, '', 'java'); 
fid = fopen('buffer.jpg', 'wb'); 
fwrite(fid, raw, 'uint8'); 
fclose(fid); 
I = imread('buffer.jpg');    
imshow(I); 

Grazie!

risposta

7

È possibile farlo con l'aiuto di Java. Esempio:

% get a stream of bytes representing an endcoded JPEG image 
% (in your case you have this by decoding the base64 string) 
fid = fopen('test.jpg', 'rb'); 
b = fread(fid, Inf, '*uint8'); 
fclose(fid); 

% decode image stream using Java 
jImg = javax.imageio.ImageIO.read(java.io.ByteArrayInputStream(b)); 
h = jImg.getHeight; 
w = jImg.getWidth; 

% convert Java Image to MATLAB image 
p = reshape(typecast(jImg.getData.getDataStorage, 'uint8'), [3,w,h]); 
img = cat(3, ... 
     transpose(reshape(p(3,:,:), [w,h])), ... 
     transpose(reshape(p(2,:,:), [w,h])), ... 
     transpose(reshape(p(1,:,:), [w,h]))); 

% check results against directly reading the image using IMREAD 
img2 = imread('test.jpg'); 
assert(isequal(img,img2)) 

La prima parte della decodifica del flusso di byte JPEG si basa su questa risposta:

JPEG decoding when data is given in array

L'ultima parte la conversione di immagini di Java a MATLAB era basato su questa soluzione pagina:

How can I convert a "Java Image" object into a MATLAB image matrix?


l'ultima parte potrebbe anche essere riscritto come:

p = typecast(jImg.getData.getDataStorage, 'uint8'); 
img = permute(reshape(p, [3 w h]), [3 2 1]); 
img = img(:,:,[3 2 1]); 

imshow(img) 
+0

Grazie, funziona senza problemi! – kahlo