VC6读取24位bmp文件

bmp格式内容包含四部分:
1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
一般的通过fread读取即可。但因为bmp格式要求,每行字节数必须4字节的整数倍,如果不对补位的空字节处理,易造成图像倾斜。
读取步骤简介:
fread(&bfType,1,sizeof(WORD),fpi);
//读取文件名
//读取bmp文件的文件头和信息头
fread(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpi);
showBmpHead(strHead);//显示文件头
fread(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpi);
showBmpInforHead(strInfo);//显示文件信息头
//读取调色板
for(unsigned int nCounti=0;nCounti

#include <stdio.h>
#include "Ex1.h"
#include "stdlib.h"
#include "math.h"
#include <iostream>
#define PI 3.14159//圆周率宏定义
#define LENGTH_NAME_BMP 30//bmp图片文件名的最大长度
using namespace std;
//变量定义
BITMAPFILEHEADER strHead; //位图文件头
RGBQUAD strPla[256];//256色调色板
BITMAPINFOHEADER strInfo;
//显示位图文件头信息
void showBmpHead(BITMAPFILEHEADER pBmpHead)
{
    cout<<"读取的位图文件信息:"<<endl;
    cout<<"文件大小:"<<pBmpHead.bfSize<<endl;
    //  cout<<"保留字_1:"<<pBmpHead.bfReserved1<<endl;
    //  cout<<"保留字_2:"<<pBmpHead.bfReserved2<<endl;
    cout<<"实际位图数据的偏移字节数:"<<pBmpHead.bfOffBits<<endl;
}
void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead)
{
    //  cout<<"读取的位图信息头:"<<endl;
    cout<<"结构体的长度:"<<pBmpInforHead.biSize<<endl;
    cout<<"位图宽:"<<pBmpInforHead.biWidth<<endl;
    cout<<"位图高:"<<pBmpInforHead.biHeight<<endl;
    cout<<"biPlanes平面数:"<<pBmpInforHead.biPlanes<<endl;
    cout<<"biBitCount采用颜色位数:"<<pBmpInforHead.biBitCount<<endl;
    cout<<"压缩方式:"<<pBmpInforHead.biCompression<<endl;
    cout<<"biSizeImage实际位图数据占用的字节数:"<<pBmpInforHead.biSizeImage<<endl;
    cout<<"X方向分辨率:"<<pBmpInforHead.biXPelsPerMeter<<endl;
    cout<<"Y方向分辨率:"<<pBmpInforHead.biYPelsPerMeter<<endl;
    cout<<"使用的颜色数:"<<pBmpInforHead.biClrUsed<<endl;
    cout<<"重要颜色数:"<<pBmpInforHead.biClrImportant<<endl<<endl;
}
int max(int i,int j)
{
    if(i>=j)
        return i;
    else
        return j;
}
int main()
{
    char strFile[LENGTH_NAME_BMP]; //bmp文件名
    WORD bfType_w=0x4d42;
    IMAGEDATA *imagedata = NULL; //动态分配存储原图片的像素信息的二维数组
    IMAGEDATA *imagedataCut = NULL;//动态分配存储裁剪后的图片的像素信息的二维数组
    IMAGEDATA *imagedataScal = NULL;//动态分配存储缩放后的图片的像素信息的二维数组
    IMAGEDATA *imagedataRot = NULL;//动态分配存储旋转后的图片的像素信息的二维数组
    int width,height;//图片的宽度和高度
    float ExpScalValue=0; 期望的缩放倍数(允许小数)
    int FloatToIntwidth,FloatToIntheight;/小数变成整数(float To Int)
    int RotateAngle=90;//要缩放的角度,默认90
    cout<<"请输入所要读取的文件名(w.bmp或者06.bmp或者07.bmp):"<<endl;
    strcpy (strFile , "E://test.bmp");
    cout<<"要读取的文件名:"<< strFile<<endl;
    FILE *fpi,*fpw;
    fpi=fopen(strFile,"rb");
    if(fpi != NULL)
    {
        //先读取文件类型
        WORD bfType;
        fread(&bfType,1,sizeof(WORD),fpi);
        if(0x4d42!=bfType)///if !=BMP
        {
            cout<<"the file is not a bmp file!"<<endl;
            return NULL;
        }
        printf("\n读取到的文件是%s。\n\n",strFile);
        //读取bmp文件的文件头和信息头
        fread(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpi);
        showBmpHead(strHead);//显示文件头
        fread(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpi);
        showBmpInforHead(strInfo);//显示文件信息头
        //读取调色板
        for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
        {
            fread((char *)&(strPla[nCounti].rgbBlue),1,sizeof(BYTE),fpi);
            fread((char *)&(strPla[nCounti].rgbGreen),1,sizeof(BYTE),fpi);
            fread((char *)&(strPla[nCounti].rgbRed),1,sizeof(BYTE),fpi);
            fread((char *)&(strPla[nCounti].rgbReserved),1,sizeof(BYTE),fpi);
        }
    }
    else
    {
        cout<<"file open error!"<<endl;
        return NULL;
    }
    width = strInfo.biWidth;
    int line_bj;//bmp 格式 规定每行占用的存储空间必须是4字节的整数倍,计算本图片的行补字节数
    line_bj = 4 - width*sizeof(IMAGEDATA) % 4;
    cout<<"width:"<<width<<endl;
    height = strInfo.biHeight;
    imagedata = (IMAGEDATA*)malloc( width * sizeof(IMAGEDATA)  * height );///为原始图像分配存储空间
    //初始化原始图片的像素数组
    for(int i = 0;i < height;++i)
    {
        for(int j = 0;j < width;++j)
        {
            (*(imagedata + i * width + j)).blue = 0;
            (*(imagedata + i * width + j)).green = 0;//8位注释
            (*(imagedata + i * width + j)).red = 0;//8位注释
        }

    }
    //补位的字节 不存储
    BYTE* pDataBuffer=new BYTE;
    //读出图片的像素数据 读取时一次一行 读高度数的行
    for(i=0;i<height;++i)
    {
        fread(imagedata + i * width,sizeof(struct tagIMAGEDATA) * width ,1,fpi);/size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

        fread(pDataBuffer,line_bj ,1,fpi);
    }

    fclose(fpi);
    //=====图片裁剪处理======//
    int leftdownx,leftdowny,rightupx,rightupy;/用户输入数值
    int Rleftdownx,Rleftdowny,Rrightupx,Rrightupy;/转换成实际可以使用数值
    cout<<"请输入要裁剪的矩形区域的左下角和右上角的坐标(连续四个整数值,如50 50 300 300):"<<endl;
    cin>>leftdownx;
    cin>>leftdowny;
    cin>>rightupx;
    cin>>rightupy;
    if(leftdownx<=0||leftdowny<=0)将用户输入的矩形框限定在原图像中
    {
        Rleftdownx=0;
        Rleftdowny=0;
    }
    else
    {
        Rleftdownx=leftdownx;
        Rleftdowny=leftdowny;
    }
    if(rightupx>=width)
    {
        Rrightupx=width;
    }
    else
    {
        Rrightupx=rightupx;
    }
    if(rightupy>=height)
    {
        Rrightupy=height;
    }
    else
    {
        Rrightupy=rightupy;
    }
    int CutWidth=Rrightupx-Rleftdownx;
    图像每一行的字节数必须是4的整数倍
    //CutWidth = (CutWidth * sizeof(IMAGEDATA) + 3) / 4 * 4;矩形框实际宽度
    //CutWidth = (CutWidth)/4 * 4;矩形框实际宽度
    //计算补位的字节数
    line_bj = 4 - CutWidth*sizeof(IMAGEDATA) % 4;
    int CutHeight=Rrightupy-Rleftdowny;矩形框实际高度
    imagedataCut = (IMAGEDATA*)malloc(CutWidth * CutHeight * sizeof(IMAGEDATA));///为裁剪后图像分配存储空间
    //初始化裁剪后图片的像素数组 一个字节一个字的写入
    for( i = 0;i < CutHeight ;++i)
    {
        for(int j = 0;j < CutWidth ;++j)
        {
            (*(imagedataCut + i * CutWidth + j)).blue = 0;
            (*(imagedataCut + i * CutWidth + j)).green = 0;//8位注释
            (*(imagedataCut + i * CutWidth + j)).red = 0;//8位注释
        }
    }
    //imagedata+=(Rleftdowny)*width+Rleftdownx;原始图像数据数组指针移动到矩形框的左下角。
    for(int k = 0;k < CutHeight;++k)裁剪区域数据提取
    {
        for(int l = 0;l < CutWidth;++l)
        *(imagedataCut + k * CutWidth + l) = *(imagedata+ (k+ Rleftdowny) * width + l + Rleftdownx);此式子一定要注意写法。主要是注意二维数组指针的用法。
    }
    //保存bmp图片
    if((fpw=fopen("Cutresult.bmp","wb"))==NULL)
    {
        cout<<"create the bmp file error!"<<endl;
        return NULL;
    }
    fwrite(&bfType_w,1,sizeof(WORD),fpw);
    fwrite(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpw);
    strInfo.biWidth = CutWidth;
    strInfo.biHeight = CutHeight;
    fwrite(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpw);
    //保存调色板数据
    for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
    {
        fwrite(&strPla[nCounti].rgbBlue,1,sizeof(BYTE),fpw);
        fwrite(&strPla[nCounti].rgbGreen,1,sizeof(BYTE),fpw);
        fwrite(&strPla[nCounti].rgbRed,1,sizeof(BYTE),fpw);
        fwrite(&strPla[nCounti].rgbReserved,1,sizeof(BYTE),fpw);
    }
    //保存像素数据
    for(i =0;i < CutHeight;++i)
    {
        for(int j = 0;j < CutWidth;++j)
        {
            fwrite( &((*(imagedataCut + i * CutWidth + j)).blue),1,sizeof(BYTE),fpw);
            fwrite( &((*(imagedataCut + i * CutWidth + j)).green),1,sizeof(BYTE),fpw);//8位注释掉
            fwrite( &((*(imagedataCut + i * CutWidth + j)).red),1,sizeof(BYTE),fpw);//8位注释掉
        }
        fwrite( &pDataBuffer,1,line_bj,fpw);//行补位字节  内容 空

    }
    printf("裁剪变换完成,请查看Cutresult.bmp文件。\n\n");
    fclose(fpw);
    //释放内存
    //delete[] imagedata;///不能释放imagedata,里面还有数据。
    delete[] imagedataCut;
    ///===========图片裁剪处理结束======
        ///==========重新打开文件======
    cout<<"请输入所要读取的文件名(Cutresult.bmp):"<<endl;
    //cin>>strFile;
    strcpy(strFile,"E://test.bmp");
    fpi=fopen(strFile,"rb");
    if(fpi != NULL)
    {
        //先读取文件类型
        WORD bfType;
        fread(&bfType,1,sizeof(WORD),fpi);
        if(0x4d42!=bfType)///if !=BMP
        {
            cout<<"the file is not a bmp file!"<<endl;
            return NULL;
        }
        printf("\n读取到的文件是%s。\n\n",strFile);
        //读取bmp文件的文件头和信息头
        fread(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpi);
        showBmpHead(strHead);//显示文件头
        fread(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpi);
        showBmpInforHead(strInfo);//显示文件信息头
        //读取调色板
        for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
        {
            fread((char *)&(strPla[nCounti].rgbBlue),1,sizeof(BYTE),fpi);
            fread((char *)&(strPla[nCounti].rgbGreen),1,sizeof(BYTE),fpi);
            fread((char *)&(strPla[nCounti].rgbRed),1,sizeof(BYTE),fpi);
            fread((char *)&(strPla[nCounti].rgbReserved),1,sizeof(BYTE),fpi);
        }
        width = strInfo.biWidth;
        height = strInfo.biHeight;
        //每行的补位字节数
        line_bj = 4 - width*sizeof(IMAGEDATA) % 4;
        imagedata = (IMAGEDATA*)malloc(width * height * sizeof(IMAGEDATA));///为原始图像分配存储空间
        //初始化原始图片的像素数组
        for(int i = 0;i < height;++i)
        {
            for(int j = 0;j < width;++j)
            {
                (*(imagedata + i * width + j)).blue = 0;
                (*(imagedata + i * width + j)).green = 0;
                (*(imagedata + i * width + j)).red = 0;
            }
        }
        //读出图片的像素数据 读取时一次一行 读高度数的行
        //fread(imagedata,sizeof(struct tagIMAGEDATA) * width,height,fpi);/
        //读出图片的像素数据 读取时一次一行 读高度数的行
        for(i=0;i<height;++i)
        {
            fread(imagedata + i * width,sizeof(struct tagIMAGEDATA) * width ,1,fpi);/size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

            fread(pDataBuffer,line_bj ,1,fpi);
        }
        fclose(fpi);
    }
    else
    {
        cout<<"file open error!"<<endl;
        return NULL;
    }
    //图片缩放处理
    cout<<"请输入要缩放的倍数:"<<endl;
    cin>>ExpScalValue;
    ///如果ExpScalValue含有小数,需要整数化
    ///对期望的缩放结果取整
    FloatToIntwidth=(int)(ExpScalValue*width);
    FloatToIntheight=(int)(ExpScalValue*height);
    //图像每一行的字节数必须是4的整数倍
    //FloatToIntwidth = (FloatToIntwidth * sizeof(IMAGEDATA) + 3) / 4 * 4;
    line_bj = 4 - FloatToIntwidth*sizeof(IMAGEDATA) % 4;
    imagedataScal = (IMAGEDATA*)malloc(FloatToIntwidth * FloatToIntheight * sizeof(IMAGEDATA));///为缩放后图像分配存储空间
    //初始化缩放后图片的像素数组 一个字节一个字的写入
    for(int i = 1;i < FloatToIntheight ;++i)
    {
        for(int j = 0;j < FloatToIntwidth ;++j)
        {
            (*(imagedataScal + i * FloatToIntwidth + j)).blue = 0;
            (*(imagedataScal + i * FloatToIntwidth + j)).green = 0;
            (*(imagedataScal + i * FloatToIntwidth + j)).red = 0;
        }
    }
    int pre_i,pre_j,after_i,after_j;//缩放前后对应的像素点坐标
    for( i=0;i<FloatToIntheight;++i)
    {
        for(int j=0;j<FloatToIntwidth;++j)
        {
            after_i=i;
            after_j=j;
            pre_i = (int)(after_i/ExpScalValue);/取整,插值方法为:最邻近插值(近邻取样法)
            pre_j = (int)(after_j/ExpScalValue);
            if(pre_i >= 0 && pre_i < height && pre_j >= 0 && pre_j < width)//在原图范围内
            *(imagedataScal + i * FloatToIntwidth + j) = *(imagedata + pre_i * width + pre_j);
        }
    }
    //保存bmp图片
    if((fpw=fopen("Scalresult.bmp","wb"))==NULL)
    {
        cout<<"create the bmp file error!"<<endl;
        return NULL;
    }
    fwrite(&bfType_w,1,sizeof(WORD),fpw);
    fwrite(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpw);
    strInfo.biWidth = FloatToIntwidth;
    strInfo.biHeight = FloatToIntheight;
    fwrite(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpw);
    //保存调色板数据
    for(int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
    {
    fwrite(&strPla[nCounti].rgbBlue,1,sizeof(BYTE),fpw);
    fwrite(&strPla[nCounti].rgbGreen,1,sizeof(BYTE),fpw);
    fwrite(&strPla[nCounti].rgbRed,1,sizeof(BYTE),fpw);
    fwrite(&strPla[nCounti].rgbReserved,1,sizeof(BYTE),fpw);
    }
    //保存像素数据
    for(i =0;i < FloatToIntheight;++i)
    {
        for(int j = 0;j < FloatToIntwidth;++j)
        {
            fwrite( &((*(imagedataScal + i * FloatToIntwidth + j)).blue),1,sizeof(BYTE),fpw);
            fwrite( &((*(imagedataScal + i * FloatToIntwidth + j)).green),1,sizeof(BYTE),fpw);
            fwrite( &((*(imagedataScal + i * FloatToIntwidth + j)).red),1,sizeof(BYTE),fpw);
        }
        fwrite( &pDataBuffer,1,line_bj,fpw);//行补位字节  内容 空
    }
    printf("缩放变换完成,请查看Scalresult.bmp文件。\n\n");
    fclose(fpw);
    //释放内存
    delete[] imagedata;
    delete[] imagedataScal;
    ==============图像缩放处理结束==============///
    ///===============图片旋转处理====================///
    cout<<"请输入所要读取的文件名(Scalresult.bmp):"<<endl;
    cin>>strFile;
    FILE *fRor,*fRow;
    int AnyX=0;为适应任意形状做的长宽调整参数
    fRor=fopen(strFile,"rb");
    if(fRor != NULL){
    //先读取文件类型
    WORD bfType;
    fread(&bfType,1,sizeof(WORD),fRor);
    if(0x4d42!=bfType)
    {
    cout<<"the file is not a bmp file!"<<endl;
    return NULL;
    }
    printf("\n读取到的文件是%s。\n\n",strFile);
    //读取bmp文件的文件头和信息头
    fread(&strHead,1,sizeof(tagBITMAPFILEHEADER),fRor);
    showBmpHead(strHead);//显示文件头
    fread(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fRor);
    showBmpInforHead(strInfo);//显示文件信息头
    //读取调色板
    for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
    {
    fread((char *)&(strPla[nCounti].rgbBlue),1,sizeof(BYTE),fRor);
    fread((char *)&(strPla[nCounti].rgbGreen),1,sizeof(BYTE),fRor);
    fread((char *)&(strPla[nCounti].rgbRed),1,sizeof(BYTE),fRor);
    fread((char *)&(strPla[nCounti].rgbReserved),1,sizeof(BYTE),fRor);
    }
    width = strInfo.biWidth;
    height = strInfo.biHeight;
    AnyX=max(width,height);///适合任意形状图形
    //图像每一行的字节数必须是4的整数倍
    width = (width * sizeof(IMAGEDATA) + 3) / 4 * 4;
    //imagedata = (IMAGEDATA*)malloc(width * height * sizeof(IMAGEDATA));
    imagedata = (IMAGEDATA*)malloc(width * height);
    //  imagedataRot = (IMAGEDATA*)malloc(2 * width * 2 * height * sizeof(IMAGEDATA));
    imagedataRot = (IMAGEDATA*)malloc(2 * AnyX * 2 * AnyX * sizeof(IMAGEDATA));
    //初始化原始图片的像素数组
    for(int i = 0;i < height;++i)
    {
    for(int j = 0;j < width;++j)
    {
    (*(imagedata + i * width + j)).blue = 0;
    //(*(imagedata + i * width + j)).green = 0;
    //(*(imagedata + i * width + j)).red = 0;
    }
    }
    //初始化旋转后图片的像素数组
    //for( i = 0;i < 2 * height;++i)
    for( i = 0;i < 2 * AnyX;++i)
    {
    for(int j = 0;j < 2 * AnyX;++j)
    {
    (*(imagedataRot + i * 2 * AnyX + j)).blue = 0;
    //(*(imagedataRot + i * 2 * width + j)).green = 0;
    //(*(imagedataRot + i * 2 * width + j)).red = 0;
    }
    }
    //读出图片的像素数据
    fread(imagedata,sizeof(struct tagIMAGEDATA) * width,height,fRor);
    fclose(fRor);
    }
    else
    {
    cout<<"file open error!"<<endl;
    return NULL;
    }
    //图片旋转处理
    double angle;//要旋转的弧度数
    int midX_pre,midY_pre,midX_aft,midY_aft;//旋转所围绕的中心点的坐标
    midX_pre = width / 2;
    midY_pre = height / 2;
    midX_aft = AnyX;
    midY_aft = AnyX;
    cout<<"请输入要旋转的角度(0度到360度,逆时针旋转):"<<endl;
    cin>>RotateAngle;
    angle = 1.0 * RotateAngle * PI / 180;
    /* 图像旋转的几何公式
    x2=x1*cos(θ2)-y1*sin(θ2);
    y2=x1*sin(θ2)+y1*cos(θ2);
    */
    //  for( i = 0;i < 2 * height;++i)
    for( i = 0;i < 2 * AnyX;++i)
    {
    for(int j = 0;j < 2 * AnyX;++j)
    {
    after_i = i - midX_aft;//坐标变换,如果不变换坐标,以(0,0)为参考点旋转后图片将转出坐标外。
    after_j = j - midY_aft;
    pre_i = (int)(cos((double)angle) * after_i - sin((double)angle) * after_j) + midX_pre ; /取整,插值方法为:最邻近插值(近邻取样法)
    pre_j = (int)(sin((double)angle) * after_i + cos((double)angle) * after_j) + midY_pre;
    /*after_i = i;
    after_j = j; 坐标不变换
    pre_i = (int)(cos((double)angle) * after_i - sin((double)angle) * after_j) ;
    pre_j = (int)(sin((double)angle) * after_i + cos((double)angle) * after_j) ;*/坐标不变换效果
    if(pre_i >= 0 && pre_i < height && pre_j >= 0 && pre_j < width)//在原图范围内
    *(imagedataRot + i * 2 * AnyX + j) = *(imagedata + pre_i * AnyX + pre_j);
    }
    }
    //保存bmp图片
    if((fRow=fopen("Rotresult.bmp","wb"))==NULL)
    {
    cout<<"create the bmp file error!"<<endl;
    return NULL;
    }
    bfType_w=0x4d42;
    fwrite(&bfType_w,1,sizeof(WORD),fRow);//fRow自动+=2;
    fwrite(&strHead,1,sizeof(tagBITMAPFILEHEADER),fRow);
    strInfo.biWidth = 2 * AnyX;//width;
    strInfo.biHeight = 2 * AnyX;//height;
    fwrite(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fRow);
    //保存调色板数据
    for( nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
    {
    fwrite(&strPla[nCounti].rgbBlue,1,sizeof(BYTE),fRow);
    fwrite(&strPla[nCounti].rgbGreen,1,sizeof(BYTE),fRow);
    fwrite(&strPla[nCounti].rgbRed,1,sizeof(BYTE),fRow);
    fwrite(&strPla[nCounti].rgbReserved,1,sizeof(BYTE),fRow);
    }
    //保存像素数据
    for( i =0;i < 2 * AnyX;++i)
    {
    //for(int j = 0;j < 2 * width;++j)
    for(int j = 0;j < 2 * AnyX;++j)
    {
    fwrite( &((*(imagedataRot + i * 2 * AnyX + j)).blue),1,sizeof(BYTE),fRow);
    //fwrite( &((*(imagedataRot + i * 2 * width + j)).green),1,sizeof(BYTE),fpw);
    //fwrite( &((*(imagedataRot + i * 2 * width + j)).red),1,sizeof(BYTE),fpw);
    }
    }
    printf("旋转变换完成,请查看Rotresult.bmp文件。\n\n");
    fclose(fRow);
    //释放内存
    delete[] imagedata;
    delete[] imagedataRot;
    /==================图像旋转处理结束============///
    return 1;
}
/*
程序用到的图片从谷歌图片里可以搜到,只要是8位BMP位图即可。 将名字改成06.bmp、07.bmp或w.bmp
*/

版权声明:本文为qq_40006700原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。