通过excel单元格背景填色,做成图片的样子。最开始在一个公众号上看到这个做法并给出了些基本函数,就照着码了一下。做过去好久了,链接也找不到了,就先不贴了…上面没有给出详细代码,我自己的做法比较傻逼,肯定有更好的,就码个demo自己看吧。
1.载入图片&设置一下
img=imread('...\camera.jpg');
img=imresize(img,[300,170]);%预处理下吧,因为excel单元格是长方形的,就行多一点,省的拉扁了
% 然后,列数<702吧(A—Z—AA—ZZ)没在往三位数上码。应该有更好的方式而不是分类谈论
% 初始设置一些东西,做过去太久了都忘了啥意思了
Excel=actxserver('Excel.application');
Excel.visible=1;
Workbook=Excel.Workbooks.Add;
Sheets = Excel.ActiveWorkbook.Sheets;
Sheet1 = Sheets.Item(1);
Sheet1.Activate;
2.填色函数
将原始图像中RGB三个通道灰度值,表示为excel中背景色的数值。例如在PS中,天大蓝的色号00(R)51(G)8E(B) ,(如只打FF默认是B,24k纯蓝色);excel中的顺序是8E5100(R最小,G其次,B最大)。matlab里第一个通道R,第二个G,第三个B,所以,第一个的值直接带,第二个256,第三个65536。
%上面用了300*170
for (i=1:300);%行数
for (j=1:170);%列数
R=img(i,j,1);
G=img(i,j,2);
B=img(i,j,3);
color=double(R)+256*double(G)+65536*double(B);%对应颜色
lie=lettertoxls(j)%列转换成ABC这样子
str2=int2str(i);%int to str行数当作字符
position=strcat(lie,str2)%字符串连接函数,[列,行]。如A1单元格
Sheet1.Range(pisition).Interior.Color=color;%单元格填色函数
end
end
3.由于行是用了A-Z表示,需要十进制转化成A-Z的进制。
这个好像不是26进制吧。26进制的话,0(D)对应A,26(D)对应BA,即Z之后应该是BA而不是AA吧。(也可能是我脑残)
网上搜了个进制转换我跑着不对(忘了怎么回事了)…先自己将就着码了一个
这个函数只写到了两位A-ZZ。(等看到好方法的再说吧,这样罗列不是办法…)
存储为lettertoxls.mat
写过去好久了,当时也没打注释…有空再标注吧反正能用
function s=lettertoxls(Integer0)
if (mod(Integer0,26)==0);
if (Integer0==26)
s='Z'
elseif(Integer0<676)
Integer1 = fix((Integer0-26)/26);
a=letter2char(Integer1);
b='Z';
s=strcat(a,b)
end
%
elseif (Integer0<26)
a=letter2char(Integer0);
s=strcat(a)
elseif(Integer0<676)
Integer1 = fix(Integer0/26);
Remainder1 = mod(Integer0,26);
a=letter2char(Integer1);
b=letter2char(Remainder1);
s=strcat(a,b)
end
还有个letter2char.mat,数字转ascii码的函数
function str=letter2char(num)
s=num+64;
str=char(s);
总而言之终于是能用了,跑了一遍就丢那里再也没管了。
结果图: