4

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

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

我尝试了这段代码(数据名称:ffout2):

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

或与:

print -djpeg 'FIG1.jpg';

两种代码均以 1201 x 901 24 位(彩色)格式导出文件

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

4

2 回答 2

4

你的代码

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

或者

print -djpeg 'FIG1.jpg';

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

但是这段代码

imwrite(fftout2,'File.jpg');

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

编辑1

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

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)

于 2013-10-23T06:24:15.373 回答
1

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

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

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

捕获帧的分辨率

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

编辑:

print要使用命令获得相同的效果,您需要使用此 MathWorks 图形设置指南中-r所述的开关指定屏幕分辨率。该开关为您提供默认分辨率,但不一定是另存为为您提供的分辨率。例如:-r0

print -djpeg -r0 'FIG1.jpg'

另存为和getframe/使用frame2im的分辨率与此处使用的自动分辨率不同。有趣的是,我试图找到一个-r与另存为菜单(和getframe)返回的分辨率相同的分辨率,但找不到合适的-r. 关闭是-r87针对我的 1600x1200 显示器的。没有什么能与 . 保存的屏幕抓取完全匹配getframegetframe如果您只想获得屏幕上的内容而不担心打印分辨率, 也许最好只使用它。无论如何,DPI 都是一个愚蠢的概念,除非您正在打印或总是希望在相同大小的显示器上显示文件。

于 2013-10-23T06:59:49.470 回答