数字序列如何Excel中字母表示的序列——一种特殊的十进制转二十六进制,以matlab调用excel画一幅像素画为例

数字序列如何Excel中字母表示的序列——一种特殊的十进制转二十六进制,以matlab调用excel画一幅像素画为例

    • matlab代码
  • 十进制转二十六进制

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)。

数字序列如何Excel中字母表示的序列——一种特殊的十进制转二十六进制,以matlab调用excel画一幅像素画为例_第1张图片

因为十进制转其他进制是除以进制数,这里就要考虑一下整除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

你可能感兴趣的:(数学与算法)