Из сырого бит в JPEG без записи в файл

У меня есть приложение в реальном времени, которое получает изображения jpg, закодированные в base64. Я не знаю, как показать изображение в matlab без необходимости сохранять изображение на диске и открывать его после этого.

Это код, который у меня есть до сих пор, который сохраняет изображение на диске, прежде чем показывать его:

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

спасибо!

1 ответов


Вы можете сделать это с помощью Java-приложений. Пример:

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

первая часть декодирования потока байтов JPEG основана на следующем ответе:

JPEG декодирование, когда данные приведены в массиве

последняя часть преобразование изображений Java в MATLAB была основана на этой странице решения:

как я могу преобразовать объект "Java Image" в матрицу изображений MATLAB?


последняя часть также может быть переписана в виде:

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

imshow(img)