【问题标题】:Matlab saving picturematlab保存图片
【发布时间】:2013-10-24 01:09:00
【问题描述】:

我想用这个代码保存图片,但是用代码保存图片时,图片的大小会与手动另存为不同。

是否有另一种与使用代码的手动另存为方法相同的另一种保存方法?

我试了一下这段代码(数据名:ffout2):

imagesc(fftout2); figure(gcf);
saveas(gcf,[pwdpath '\Image\' ClassName '\',WavClass(WavClassIndex).name '.jpg'], 'jpg');

或与:

print -djpeg 'FIG1.jpg';

两个代码都以 1201 x 901 24 位(彩色)导出文件

但使用手动另存为,尺寸将为 561 x 420 ,24 位(彩色)

【问题讨论】:

  • 最好使用fullfile命令来定义文件名和路径,而不是[pwdPath '\Image' ...fullfile 对操作系统敏感,可以更轻松地跨平台移植代码。

标签: matlab


【解决方案1】:

你的代码

imagesc(fftout2);
figure(gcf);
saveas(gcf,[pwdpath '\Image\' ClassName '\',WavClass(WavClassIndex).name '.jpg'], 'jpg');

print -djpeg 'FIG1.jpg';

保存屏幕上显示的 MATLAB 图,包括坐标轴、刻度标签、标题等。

但是这段代码

imwrite(fftout2,'File.jpg');

将纯图像数据写入文件。 两种方式都是正确的,取决于你的目标是什么。

EDIT1

在@chappjc 的回答和他的评论之后,我做了一些测试,似乎所有这些方法都可以调整以提供相同的图像大小,即使是具有适当 DPI 设置的print 功能。检查此代码

img = rand(100,200,3);
figure;                                         % size is 560 x 420 pixels
imagesc(img);
get(gcf,'Position')
F = getframe(gcf);
size(F.cdata)
[im,map] = frame2im(F);
if isempty(map)
    imwrite(im,'SaveAsFig_RGB.png');            %  560 x  420 image
else
    imwrite(im,map,'SaveAsFig_WithCMAP.png');   %  
end
print(gcf, '-djpeg',       'FIG_000.jpg');      % 1200 x  900 image
print(gcf, '-djpeg','-r70','FIG_070.jpg');      %  560 x  420 image
print(gcf, '-djpeg','-r72','FIG_072.jpg');      %  576 x  432 image
print(gcf, '-djpeg','-r96','FIG_096.jpg');      %  768 x  576 image
get(0,'ScreenPixelsPerInch')                    % gives 96

有趣的是,为了获得保存图像的大小,我必须设置 70 dpi (Win7 + R2001b),这与 MATLAB 存储在根对象中的屏幕 DPI 分辨率 (96 dpi) 不同(参见 get(0)

【讨论】:

  • 不幸的是,这些选项实际上都没有完全满足答案的要求,即模拟“另存为”菜单的输出大小。 getframe 命令将为您获取使用 imwrite 所需的数据并获取请求的(真实屏幕)输出大小。我已经在我的回答中详细说明了这个过程。
  • @chappjc 同意。但这对我来说并不清楚。有趣的是,1201/561 与 901/420 几乎相同。这可以通过适当的 DPI 值解决
  • Here's an old post from a MathWorks employee 试图解释 MATLAB 如何获得用于打印的分辨率。它陈旧而模糊,但关键是它似乎依赖于系统,因此尝试猜测数字可能是浪费时间。为什么get(0,'ScreenPixelsPerInch') 给出不同的数字,我不知道。但你至少可以set(0,'ScreenPixelsPerInch',R)。这就是为什么我建议getframe为您处理。
  • 在我的带有 1600x1200 显示器的机器上,我找不到合适的 -r。另存为输出的关闭是-r87。没有任何东西与getframe保存的屏幕抓取完全匹配。
【解决方案2】:

您要求使用与通过手动“另存为”菜单保存的文件具有相同尺寸的代码来保存文件。要获得与“另存为”菜单相同的大小,您必须使用getframeframe2im 命令,如下所示,

F = getframe(gcf);
[im,map] = frame2im(F);
if isempty(map)
    imwrite(im,'SaveAsFig.jpg');
else
    imwrite(im,map,'SaveAsFig.jpg');
end

如果您使用saveasprint,您可能会得到不同尺寸的文件。对于 imwrite(fftout2) 类似,它存储的文件将具有本机矩阵大小而不是“另存为”大小。 getframe 的操作可确保文件分辨率反映您在屏幕上的内容。来自文档:

捕获帧的分辨率

框架图像的分辨率取决于调用getframe 时轴的大小(以像素为单位)。当getframe 命令拍摄屏幕快照时,如果轴尺寸较小(例如,因为您已将视图限制在轴内的窗口中),getframe 捕获的屏幕像素较少,并且捕获的图像可能如果放大显示,分辨率会很差。

编辑:

要使用print 命令获得相同的效果,您需要使用-r 开关指定屏幕分辨率,如this MathWorks guide to figure settings 中所述。 -r0 开关为您提供默认分辨率,但不一定是另存为为您提供的分辨率。例如:

print -djpeg -r0 'FIG1.jpg'

另存为和getframe/frame2im 使用的分辨率与此处使用的自动分辨率不同。有趣的是,我试图找到一个-r,它提供了与另存为菜单(和getframe)返回的相同分辨率,但找不到合适的-r。我的 1600x1200 显示器的收盘价是 -r87。没有什么能与getframe 保存的屏幕抓取完全匹配。如果您只想获得屏幕上的内容而不担心打印分辨率,那么最好使用getframeDPI is kind of a silly concept anyway 除非您正在打印或总是希望在相同大小的显示器上显示文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多