MatLab:将 JPEG 二进制数据作为图像打开

MatLab: Open JPEG binary data as Image

我 运行 在尝试打开我使用 fread() 读入 MatLab 的二进制数据时遇到了问题。 我的第一种方法是使用 fwrite() 保存图像,但 MatLab 似乎总是默认使用 Windows-1252 编码,这会在写入时丢失一些数据。 (如果我打开原始输入和输出,内容是相同的,除了输出缺少像“ÿØÿà”这样的字符,这显然意味着图像正在损坏。

我没有找到解决此编码问题的方法。

虽然我确实认为这个方法应该有效,但我也不想在打开文件之前将数据写入文件。最好立即创建一个图像变量。不过,我没有找到这样做的解决方案。

我当前的代码:

读取图像数据

fid = fopen("ente2.jpg",'rb');
bytes = fread(fid);
fclose(fid);

正在保存图像

outfile = 'out.jpg';
[fid, msg] = fopen(outfile, 'w', "n","UTF-8");
if fid < 0
  error('Failed to create file "%s" because "%s"', outfile, msg);
end
fwrite(fid, bytes, 'uint32');
fclose(fid);

打开图片

p = imread(outfile);
figure();
imshow(outfile);

该方法是正确的,但您的实施几乎没有问题:

  • bytes = fread(fid); 将数据读取为 uint8 个元素,但将数据转换为 class double.
    为避免自动转换使用:bytes = fread(fid, '*uint8');.
    显示 class 为 double:

    的代码示例
     fid = fopen('football.jpg', 'rb');
     bytes = fread(fid); % The MATLAB default is converting data to class double
     display(class(bytes)) % double
     fclose(fid);
    
  • 将数据保存到文件时,您应该不要设置编码。
    只有文本文件使用编码。
    您正在将数据写入二进制文件,而二进制文件只是字节序列(没有编码)。
    打开二进制文件进行写入:

     [fid, msg] = fopen(outfile, 'wb');
    
  • fwrite(fid, bytes, 'uint32');bytes 保存为类型 'uint32'.
    您需要将 bytes 保存为 uint8:

     fwrite(fid, bytes, 'uint8');
    

完整代码示例:

% Reading the image data
fid = fopen('football.jpg', 'rb');
bytes = fread(fid, '*uint8'); % Use '*uint8' to keep data in uint8 class
display(class(bytes)) % displays uint8
fclose(fid);

% Saving the image
outfile = 'out.jpg';
[fid, msg] = fopen(outfile, 'wb');
if fid < 0
    error('Failed to create file "%s" because "%s"', outfile, msg);
end
%fwrite(fid, bytes, 'uint32'); % Why saving as uint32?
fwrite(fid, bytes, 'uint8');
fclose(fid);

% Opening the image
p = imread(outfile);
figure();
imshow(outfile);

结果: