《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 35263|回复: 206
收起左侧

[源码] 【原创】使用MATLAB玩转Excel拼图

    [复制链接]
发表于 2011-3-13 23:10:40 | 显示全部楼层 |阅读模式
相信大家都玩过拼图,有人用钉子拼图:
钉子拼图.jpg
有人用打死的蚊子拼图:
斯大林.jpg
有人用答题卡拼图:
答题卡流氓兔.jpg
答题卡.jpg
有人用瓜子拼图:
瓜子壳拼图.jpg
瓜子壳拼图2.jpg
女生们玩过十字绣:
十字绣1.jpg
十字绣.jpg
这里教大家玩转Excel拼图,就是把Excel的每一个单元格作为一个像素点,通过在Excel单元格中填充底色的方式绘图。在正常尺寸下,我们很难看出是什么图形,但是当把Excel的单元格的行高和列宽都改小时,我们就看得一目了然了。我这里编了一个程序,大家不妨玩一玩,体会一个像素一个像素绘图的感觉,本程序可以导入一幅图片(灰度图像或真彩图像)到Excel中,由于是底色绘图,还不妨碍在图上写字。把做成的Excel拼图的单元格的行高和列宽改大一些发给别人,别人肯定看不出是什么,然后再告诉他秘诀,或许会给他带来惊喜。快试一试吧,觉得好就顶一下!有啥改进意见也希望大家畅所欲言!

先发一个我做的Excel拼图,效果图如下:
EXCEL拼图.jpg
程序代码如下:
  1. function photo2excel(filename)
  2. % 利用MATLAB通过填色的方式把图像画入Excel文档(玩转Excel拼图)
  3. %   photo2excel(filename)  输入参数filename为包含图片文件所在路径的字符串
  4. %   photo2excel(I)         输入参数I为图像灰度值矩阵
  5. %   
  6. %   注:图像可以是灰度图像或真彩图像
  7. %   Copyright 2010 - 2011 xiezhh.
  8. %   $Revision: 1.0.0.0 [        DISCUZ_CODE_1        ]nbsp; $Date: 2011/03/12 13:41:00 $

  9. % 判断输入参数类型,导入图像灰度值矩阵
  10. if ischar(filename) && exist(filename,'file');
  11.     I = imread(filename);
  12. elseif isnumeric(filename)
  13.     I = filename;
  14. else
  15.     error('输入参数类型不匹配');
  16. end
  17. I = uint8(I);

  18. % 判断图像类型
  19. [m,n,k] = size(I);
  20. if k == 1
  21.     I = repmat(I,[1 1 3]);
  22. end
  23. if k ~= 1 && k ~= 3
  24.     error('图像类型不匹配,只能是灰度图像或真彩图像');
  25. end

  26. % 设定要保存的Excel文件名和路径
  27. filespec_user = [pwd '\我的照片.xls'];

  28. % 判断Excel是否已经打开,若已打开,就在打开的Excel中进行操作,否则就打开Excel
  29. try
  30.     % 若Excel服务器已经打开,返回其句柄Excel
  31.     Excel = actxGetRunningServer('Excel.Application');
  32. catch
  33.     % 创建一个Microsoft Excel服务器,返回句柄Excel
  34.     Excel = actxserver('Excel.Application');
  35. end;

  36. % 设置Excel服务器为可见状态
  37. Excel.Visible = 1;

  38. % 新建一个工作簿,并保存,文件名为我的照片.Excel
  39. Workbook = Excel.Workbooks.Add;
  40. %Workbook.SaveAs(filespec_user);

  41. % 返回当前工作表句柄
  42. Sheets = Excel.ActiveWorkbook.Sheets;
  43. Sheet1 = Sheets.Item(1);    % 返回第1个表格句柄

  44. % 设置行高和列宽
  45. SC1 = Sheet1.Cells;
  46. % 设置行高
  47. SC1.RowHeight = 1.5;
  48. % 设置列宽
  49. SC1.ColumnWidth = 0.15;

  50. % 通过填色的方式绘图
  51. ColNum = SC1.Columns.Count;
  52. RowNum = SC1.Rows.Count;
  53. I = double(I);
  54. ColorIndex = I(:,:,1) + 256*I(:,:,2) + 65536*I(:,:,3);
  55. for j = 1:n
  56.     for i = 1:m
  57.         SC1.Item((i-1)*ColNum + j).Interior.Color = ColorIndex(i,j);
  58.     end
  59. end

  60. Workbook.Save   % 保存文档
复制代码

评分

参与人数 2威望 +10 贝壳 +20 贡献 +20 收起 理由
baby_wolf + 5 + 10 + 10 好挖
qibbxxt + 5 + 10 + 10 原创

查看全部评分

发表于 2017-9-16 16:03:35 | 显示全部楼层
谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢
回复 支持 反对

使用道具 举报

发表于 2016-6-25 15:04:57 | 显示全部楼层
回复学习一下,看起来很有意思啊
回复 支持 反对

使用道具 举报

发表于 2017-5-31 12:14:58 | 显示全部楼层
找了好长时间,想学习一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-13 23:13:58 | 显示全部楼层
本程序在Excel2007下经过了测试!
发表于 2011-3-13 23:35:32 | 显示全部楼层
发表于 2011-3-13 23:41:12 | 显示全部楼层
貌似在MATLAB中文论坛上见过楼主,顶一个
发表于 2011-3-14 01:29:57 | 显示全部楼层
lz问你一个问题。。。如果在excel中有数据,我想用matlab处理数据,然后得出方程。
我不知道有没有办法。。。还是说数据必须要自己输入。。。以为内是很大的数据。
5个输入,2个输出。。然后是150组,我希望能有两个方程。。。
谢谢了。。
 楼主| 发表于 2011-3-14 07:30:47 | 显示全部楼层
回复 filey19 的帖子

先用xlsread函数把Excel中的数据读入matlab,然后做数据拟合,可以用nlinfit函数或cftool函数,还有其他函数,你可以在论坛上搜搜数据拟合或回归分析。
发表于 2011-3-14 08:00:44 | 显示全部楼层
发表于 2011-3-14 08:24:27 | 显示全部楼层
前来学习!
发表于 2011-3-14 09:17:43 | 显示全部楼层
蛮有趣的下来看看
发表于 2011-3-14 09:18:19 | 显示全部楼层
谢老师太牛了!哈哈,玩到这样境界确实NB
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-10-27 13:45 , Processed in 0.062373 second(s), 15 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表