现在已实现的功能:把BMP图片读入一维数组中,可以正常绘出正立的图;为了学习测试,想绘一个倒立图出来,想同时绘一个正立和倒立的图片出来。
不重新读图片文件,
想通过转换行列的算法,转成倒立的,不知道该如何实现???

解决方案 »

  1.   

    //把BMP图片中的数据读入一维数组中unsigned char *pBmpBuffer;   //bmp像素指针
    int BmpWidth;                //宽
    int BmpHeight;               //高
    RGBQUAD *ColorTable;         //颜色表
    int BmpBit;                  //位数//加载bmp图片
    bool LoadBmp(char *BmpName)   //从硬盘中读取BMP文件进内存
    {
     FILE *fp=fopen(BmpName,"rb");
     if(fp==0)
       return 0;

     fseek(fp,sizeof(BITMAPFILEHEADER),0);  //跳过BITMAPFILEHEADER
     BITMAPINFOHEADER head;
     fread(&head,sizeof(BITMAPINFOHEADER),1,fp); //head结构体

     BmpWidth=head.biWidth;                //宽
     BmpHeight=head.biHeight;              //高
     BmpBit=head.biBitCount;               //位数
     int LineByte=(BmpWidth*BmpBit/8+3)/4*4; //一行真实字节数

     if(BmpBit==8)  //如果是8位图
     { 
     ColorTable=new RGBQUAD[256]; //申请颜色表需要的空间,读颜色表进内存
     fread(ColorTable,sizeof(RGBQUAD),256,fp); 
     }

     pBmpBuffer= new unsigned char[LineByte*BmpHeight]; //申请空间
     fread(pBmpBuffer,1,LineByte*BmpHeight,fp);         //读像素数据进内存

     fclose(fp); return 1;
    }
      

  2.   

    告诉你原理:
    原图f(x,y)
    新图g(x,y)
    g(x,y) = f(x,height-y);
    建议你先仔细研究研究bmp文件的结构,里面有你进行for循环所需的数据
      

  3.   

    如果你用Gdi+画的画,直接用g.RotateTransform(angle);载入图片使用CImage::FromFile("")
    画图用g.DrawImage()。
    如果你是把位图读入内存,使用StretchDIBits或者Bitblt或者stretchBlt的画,可以根据下面的原则:
    (1)将原图像读入缓冲区   (2) 计算图像的高度,即行数height;计算图像宽度width;根据宽度、高度生成新缓冲区;   (3)把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至全部交换完毕。既原图中的(x、y)点,在新生成的图象中对应为x1=x,y1=height-1-y。把原图中的象素值读入新缓冲区的(x1,y1)点处。   (4)显示位图 
      

  4.   

    需要一个for循环。至于程序代码看一楼的,写蛮清楚,再根据自己的需要改下,应该是这样的。
      

  5.   

    //把BMP图片中的数据读入一维数组中unsigned char *pBmpBuffer;   //bmp像素指针
    int BmpWidth;                //宽
    int BmpHeight;               //高
    RGBQUAD *ColorTable;         //颜色表
    int BmpBit;                  //位数//加载bmp图片
    bool LoadBmp(char *BmpName)   //从硬盘中读取BMP文件进内存
    {
     FILE *fp=fopen(BmpName,"rb");
     if(fp==0)
       return 0;
        
     fseek(fp,sizeof(BITMAPFILEHEADER),0);  //跳过BITMAPFILEHEADER
     BITMAPINFOHEADER head;
     fread(&head,sizeof(BITMAPINFOHEADER),1,fp); //head结构体
        
     BmpWidth=head.biWidth;                //宽
     BmpHeight=head.biHeight;              //高
     BmpBit=head.biBitCount;               //位数
     int LineByte=(BmpWidth*BmpBit/8+3)/4*4; //一行真实字节数
        
     if(BmpBit==8)  //如果是8位图
     { 
     ColorTable=new RGBQUAD[256]; //申请颜色表需要的空间,读颜色表进内存
     fread(ColorTable,sizeof(RGBQUAD),256,fp); 
     }
        
     pBmpBuffer= new unsigned char[LineByte*BmpHeight]; //申请空间
     /*
     fread(pBmpBuffer,1,LineByte*BmpHeight,fp);         //读像素数据进内存
     */
      //如果你要将图片倒立的话,你可以这样读,看代码
     unsigned char *temp=pBmpBuffer+LineByte*BmpHeight;
     do
     {
      temp-=LineByte;
      fread(temp,1,LineByte,fp);
     }while(temp>=pBmpBuffer);
     //这样就把数据颠倒过来了呵呵
      
     fclose(fp); return 1;
    }