2013-09-06 34 views
6

Mam aplikację działającą w czasie rzeczywistym, która odbiera obrazy jpg zakodowane w base64. Nie wiem, jak wyświetlić obraz w Matlabie bez konieczności zapisywania obrazu na dysku i później go otwierać.Od surowych bitów do jpeg bez pisania do pliku

Jest to kod mam tak daleko, że zapisuje obraz na dysku przed pokazaniem go:

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

Dzięki!

Odpowiedz

7

Możesz to zrobić za pomocą Java. Przykład:

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

Pierwsza część dekodowania strumienia bajtów JPEG jest na podstawie tej odpowiedzi:

JPEG decoding when data is given in array

ostatnia część konwersji obrazów Java MATLAB został na podstawie tego rozwiązania strona:

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


To ostatnia część może również zostać ponownie zapisać jako:

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

imshow(img) 
+0

Dzięki, działa sprawnie! – kahlo