matlab代码
原理比较简单,实际上是将JPG图片的RGB3个波段的值分别读到3个矩阵/二维数组,再根据矩阵/数组的值确定颜色,再用程序将excel背景颜色填充即可。需要注意的是excel的单元格不是正方形,须将之重新调一下行高和列宽使之相等,行高和列宽的单位不同,需要换算 。另一个难点是 将数字表示的列序转为excel中的字母表示。
clc;
clear;
a=imread('C:\Users\csh_g\Pictures\Saved Pictures\test.jpg'); %自己的路径
a1=a(:,:,1);
a2=a(:,:,2);
a3=a(:,:,3);
% a1=round(rand(533,800)*254)+1 ;
% a2=round(rand(533,800)*254)+1 ;
% a3=round(rand(533,800)*254)+1 ;
hExcel = actxserver('excel.application'); % 创建一个excel实例对象
hWorkbooks = hExcel.Workbooks; % 创建一个活动工作本组对象
hWorkbook = hWorkbooks.invoke('Add'); % 增加一个工作本(簿)对象
hSheets = hExcel.ActiveWorkBook.Sheets; % 获得当前工作本句柄
set(hExcel,'Visible',1);
hSheet2 = hSheets.Add;
hSheet2.Activate;
hSheet2.Cells.RowHeight = 10; %设置行高
hSheet2.Cells.ColumnWidth = 1.63; %设列宽,excel行宽和列高单位不同,绘制成方格需要换算一下
for i=1:533 %行,
for j=1:800 %列 ,用列名\
%-------------序号转算列序字符串-------------------
n=j;
count=0;
temp='';
while floor(n/26)>0 %取整
yushu=mod(n,26);
if yushu==0
temp=strcat(char(26+64),temp);
n=floor(n/26)-1;
else
temp=strcat(char(yushu+64),temp);
n=floor(n/26);
end
end
if n==0
else
temp=strcat(char(n+64),temp);
end
range=strcat(temp,num2str(i));
%--------------序号换算列序字符串,实际上是十进制转26进制---------
R=a1(i,j);
G=a2(i,j);
B=a3(i,j);
color=double(R)+256*double(G)+65536*double(B);%对应颜色
hSheet2.Range(range).Interior.Color=color;
end
end
十进制转二十六进制
其中对于行序,excel中可以直接用,但是列序在excel中是字母表示的,这里可以看成是26进制的表达:A,B,C,…,Z,AA,AB,AC,…,AZ,BA,BB,BC,…,BZ,… 特殊地是,与其他进制不同,这里并不是从0开始的,可以看成是从1开始,到26结束的(理论上的26进制应该是从0开始,25结束)。
所以,这里应该如何将数字列序转为字母表达,以便excel参数识别呢。
首先确定每个数对应的字母是什么:1-26分别对应A-Z,char()可将数字转为对应ASCII字符,65是A,依次类推,则某个数字x对应字母为char(64+x)。
因为十进制转其他进制是除以进制数,这里就要考虑一下整除26的特殊情况:整除余数为0,但是0是没有对应字母的,实际上对应的是Z,所以此时应该设定为余数是26。 这一位对应的字母不应该是char(64+0),而是应该是char(64+26),即对应字母Z,代码如下(输入任意正整数数字n):
temp=''; %初始化字母列序
while floor(n/26)>0 %取整,整数不为0一直循环
yushu=mod(n,26); %取余
if yushu==0 %余数为0情况,变为余数为26,下一步的取整减1(一单位进制数)
temp=strcat(char(26+64),temp);
n=floor(n/26)-1;
else %一般情况
temp=strcat(char(yushu+64),temp);
n=floor(n/26);
end
end