2013-09-06 7 views
6

Ich habe eine Echtzeitanwendung, die JPEG-Bilder empfängt, die in base64 codiert sind. Ich weiß nicht, wie man das Bild in Matlab zeigt, ohne das Bild auf der Diskette speichern und danach öffnen zu müssen.Von rohen Bits zu JPEG ohne in eine Datei zu schreiben

Dies ist der Code, den ich so weit haben, dass das Bild auf der Platte gespeichert, bevor es zeigt:

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

Dank!

Antwort

7

Sie können es mit Hilfe von Java tun. Beispiel:

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

Der erste Teil des JPEG-Byte-Strom der Decodierung wird auf diese Antwort basiert:

JPEG decoding when data is given in array

Der letzte Teil MATLAB Umwandlung Java Bilder wurde auf diese Lösung basiert Seite:

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


Der letzte Teil auch neu geschrieben werden:

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

imshow(img) 
+0

Danke, funktioniert reibungslos! – kahlo