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);
结果:
我 运行 在尝试打开我使用 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
个元素,但将数据转换为 classdouble
.
为避免自动转换使用: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);
结果: