首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言中如何将一个图片的RGB值存入一个数组里

2013-03-28 
C语言中怎么将一个图片的RGB值存入一个数组里求大家给给例子的代码,或者主要的思想,希望大家帮帮忙啊,很急

C语言中怎么将一个图片的RGB值存入一个数组里
求大家给给例子的代码,或者主要的思想,希望大家帮帮忙啊,很急,谢谢。
[解决办法]
一定要用数组么?结构体行么?
[解决办法]
添加到搜藏已解决 
在API中如何把RGB值转化成数组值
 悬赏分:20 - 解决时间:2009-9-5 09:48 
求高手解答 附加源代码! 

提问者: zlh722418 - 一级最佳答案不懂你的意思!
API是应用程序接口,现在的软件都能实现API函数的封装,程序员无需了解操作系统的内部机制,也无需熟记大量的API函数,就能开发应用程序。

RGB图像本身就可以看成一个矩阵,而一个矩阵就可以看成一个二维数组。

学图像处理opencv比较好用,初学者容易上手。

你这个问题是不是读取图像像素的问题。

以下是使用opencv库读取图像像素并将其反色的代码,仅供参考。

方法一:
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
      int height ,width ,step ,channels ;
         int i,j,k;
         uchar*data ;
         //char *filename="result.bmp";
         IplImage* Img; //声明IplImage指针
    //载入图像
        Img = cvLoadImage( argv[1],1);
   height    = Img->height;
   width     = Img->width;
   step      = Img->widthStep/sizeof(uchar);
   channels  = Img->nChannels;
        data   = (uchar*)Img->imageData;
   printf("Processing a %d X %d image with %d channels\n",height,width,channels);

// 反色图像
  for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++)
  data[i*step+j*channels+k]=255-data[i*step+j*channels+k];//反色  k=0读B,k=1读G,k=2读R
  cvNamedWindow( "Image", 1 ); //创建窗口
        cvShowImage( "Image", Img ); //显示图像
        cvWaitKey(0); //等待按键
        cvSaveImage("filename.jpg",Img);
        cvDestroyWindow( "Image" );//销毁窗口
        cvReleaseImage( &Img ); //释放图像
        return 0;

}

方法二:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "cv.h"
#include "highgui.h"

int main( int argc, char** argv )
{
    int i,j,k;
    //载入图像
    IplImage * img=cvLoadImage(argv[1],1);
  CvScalar s;
  int  height     = img->height;
  int  width      = img->width;
  int  channel = img->nChannels;
    printf("the image is %d X %d wiht %d channels",height,width,channel);
    for(i=0;i<height;i++)
    for(j=0;j<width;j++)

    {
        s=cvGet2D(img,i,j); // get the (i,j) pixel value


        for(k=0;k<channel;k++)
        s.val[k]=255-s.val[k];//k=0读B,k=1读G,k=2读R
        cvSet2D(img,i,j,s); // set the (i,j) pixel value
   }
   cvNamedWindow( "girl", CV_WINDOW_AUTOSIZE);//创建窗口
        cvShowImage( "girl", img );//显示图像
        cvWaitKey(0); //等待按键
        cvDestroyWindow( "Image" );//销毁窗口
        cvReleaseImage( &img); //释放图像
    return 0;



 
[解决办法]
如果是未压缩的BMP图像,就很简单了
比如BMP文件是: A.BMP
1 读取文件头,比如说文件头占256字数据
  char buf[256];
  
  然后在其中找到长度和宽度和点的位数,和数据开始的偏移
  比如说,第8,9,10,12字节是整数,表示宽度
  long w=*(int*)&buf[7];
  long h=.......;
  long off=.....
  int  bitcount=.....     //位数
2 如果bitcount=24位的,则数据就是红绿蓝红绿蓝....
  如果bitcount=32位的,则数据就是红绿蓝透红绿蓝透....
  假设保存的数组是unsigned char PointColor[w*h][3];则
  fseek(文件指针,off,0);移动到数据位置
  for(int i=0;i<w*h;i++)
  {
      PointColor[i][0]=fgetc(文件指针);//红
      PointColor[i][1]=fgetc(文件指针);//绿
      PointColor[i][2]=fgetc(文件指针);//蓝
      fgetc(文件指针);//如果是32位,这里就多读一个字节扔掉
  }
---------------------
如果是压缩格式的,比如PCX,JPG,TIF.......
那么还需要解除压缩
一般是一行一行压的,也是一行一行解的
  fseek(文件指针,off,0);移动到数据位置
  char LineInfo[w][3];
  int row=0;
  for(int i=0;i<h;i++)
  {
      memset(LineInfo,0,w*3);//清零
      //读取数据并把数据解压到缓冲区LineInfo,一行数据满就处理;
      for(int j=0;j<w;j++)
      {
         PointColor[i*w+j][0]=LineInfo[j][0]//红
         PointColor[i*w+j][1]=LineInfo[j][1]//绿
         PointColor[i*w+j][2]=LineInfo[j][2]//蓝
      }
  }

  

热点排行