[已解决] MATLAB打包程序后保存图像时的尺寸不正确

[复制链接]
DoraShin 发表于 2022-5-14 18:08:50
我做了这样一个GUI,设置了一个“保存图像”按钮用来将右侧坐标轴部分的图像保存下来
1.png
“保存图像”按钮的代码如下(代码框内粘贴格式有问题,我就直接贴了):save =  uicontrol('Style', 'pushbutton',...
                            'FontSize', 13,...
                            'String', '保存图像',...
                            'Position', [20 260 100 50],...
                            'Callback', ['[FileName, PathName] = uiputfile({''*.jpg'',''JPEG(*.jpg)''}, ''Save Picture'', title);'...
                                                'filename = fullfile(PathName, FileName);'...
                                                'saveas(paint, filename);'...
                                                'a = imread(FileName);'...
                                                'a1 = imcrop(a, [185 0 910 891]);'...
                                                'delete(FileName);'...
                                                'imwrite(a1, filename);']);
由于我只想保存图窗的右半部分,所以我先用saveas将整个图像保存,再用imread读入,之后用imcrop裁剪图像,最后删掉原来的图像,保存裁剪过的。最终保存好的图像如下,尺寸为910×891:
全过程系统倾斜角.jpg
但是当我将整个程序用Application Compiler打包之后执行.exe程序,再点击“保存图像”按钮时始终会把整个图像都保存下来,图像如下尺寸为1094×891:
全过程系统倾斜角 (1).jpg
我调整了imcrop中矩阵的数值,不过没有作用,我想会不会是imread、imcrop这些函数在打包后根本就没有执行?希望能得到大家的帮助,谢谢!

最佳答案


谢中华 发表于 2022-5-15 09:57:34
介绍两种方法。
第一种方法:
新建一个隐藏的figure窗口,将GUI中坐标系里的图像复制到隐藏的figure窗口中,然后保存,删除隐藏的figure窗口,代码如下:
  1. function SaveFig(hObject, eventdata)
  2. % 保存图片子函数
  3. ha = findobj(gcf,'Type','axes');
  4. FileFormat = {'*.jpg','JPEG image (*.jpg)';
  5.     '*.emf','Enhanced metafile (*.emf)';
  6.     '*.*','All Files (*.*)'};
  7. [FileName, FilePath] = uiputfile(FileFormat,'保存图像文件','untitled.jpg');
  8. new_fig = figure('visible','off');
  9. new_axes = copyobj(ha,new_fig);
  10. set(new_axes,'position',[0.1 0.1 0.8 0.8]);
  11. if ~isequal([FileName,FilePath],[0,0])
  12.     FileFullName = [FilePath, FileName];
  13.     saveas(gca,FileFullName);
  14. end
  15. delete(new_fig);
复制代码
第二种方法:
抓取GUI中坐标系里的图像,保存为图像文件,代码如下:
  1. function SaveFig2(hObject, eventdata)
  2. % 保存图片子函数
  3. FileFormat = {'*.jpg','JPEG image (*.jpg)';
  4.     '*.emf','Enhanced metafile (*.emf)';
  5.     '*.*','All Files (*.*)'};
  6. [FileName, FilePath] = uiputfile(FileFormat,'保存图像文件','untitled.jpg');
  7. set(gca,'Units','pixels');
  8. pos = get(gca,'Position');
  9. ti = get(gca,'TightInset');
  10. rect = [-ti(1), -ti(2), pos(3)+ti(1)+ti(3), pos(4)+ti(2)+ti(4)];
  11. F = getframe(gca,rect);
  12. if ~isequal([FileName,FilePath],[0,0])
  13.     FileFullName = [FilePath, FileName];
  14.     imwrite(F.cdata,FileFullName);
  15. end
复制代码


回复此楼

2 条回复


谢中华 发表于 2022-5-15 09:57:34
介绍两种方法。
第一种方法:
新建一个隐藏的figure窗口,将GUI中坐标系里的图像复制到隐藏的figure窗口中,然后保存,删除隐藏的figure窗口,代码如下:
  1. function SaveFig(hObject, eventdata)
  2. % 保存图片子函数
  3. ha = findobj(gcf,'Type','axes');
  4. FileFormat = {'*.jpg','JPEG image (*.jpg)';
  5.     '*.emf','Enhanced metafile (*.emf)';
  6.     '*.*','All Files (*.*)'};
  7. [FileName, FilePath] = uiputfile(FileFormat,'保存图像文件','untitled.jpg');
  8. new_fig = figure('visible','off');
  9. new_axes = copyobj(ha,new_fig);
  10. set(new_axes,'position',[0.1 0.1 0.8 0.8]);
  11. if ~isequal([FileName,FilePath],[0,0])
  12.     FileFullName = [FilePath, FileName];
  13.     saveas(gca,FileFullName);
  14. end
  15. delete(new_fig);
复制代码
第二种方法:
抓取GUI中坐标系里的图像,保存为图像文件,代码如下:
  1. function SaveFig2(hObject, eventdata)
  2. % 保存图片子函数
  3. FileFormat = {'*.jpg','JPEG image (*.jpg)';
  4.     '*.emf','Enhanced metafile (*.emf)';
  5.     '*.*','All Files (*.*)'};
  6. [FileName, FilePath] = uiputfile(FileFormat,'保存图像文件','untitled.jpg');
  7. set(gca,'Units','pixels');
  8. pos = get(gca,'Position');
  9. ti = get(gca,'TightInset');
  10. rect = [-ti(1), -ti(2), pos(3)+ti(1)+ti(3), pos(4)+ti(2)+ti(4)];
  11. F = getframe(gca,rect);
  12. if ~isequal([FileName,FilePath],[0,0])
  13.     FileFullName = [FilePath, FileName];
  14.     imwrite(F.cdata,FileFullName);
  15. end
复制代码


回复此楼

DoraShin 发表于 2022-5-17 17:56:01
谢中华 发表于 2022-5-15 09:57
介绍两种方法。
第一种方法:
新建一个隐藏的figure窗口,将GUI中坐标系里的图像复制到隐藏的figure窗口中 ...

采用第二种方法成功了,感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表