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]//蓝
}
}