如何将图像转化为数据 用函数CDC::BitBlt()函数将一幅bmp的图拷贝到绘图缓存内,现在需要将绘图缓存内的图转化为数据存到二维数组中去。其中转化的数据只有0和1两种,如果该点有图像存入1,没有图像(即空白)存入0。 如何实现,望高手指点,最好给出源代码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先定义复数及其加、乘//////////////////////////////////////////////////////////// internal definitions#define PI (double)3.14159265359/*complex number*/typedef struct{ double re; double im;}COMPLEX;/*complex add*/COMPLEX Add(COMPLEX c1, COMPLEX c2){ COMPLEX c; c.re=c1.re+c2.re; c.im=c1.im+c2.im; return c;}/*complex substract*/COMPLEX Sub(COMPLEX c1, COMPLEX c2){ COMPLEX c; c.re=c1.re-c2.re; c.im=c1.im-c2.im; return c;}/*complex multiple*/COMPLEX Mul(COMPLEX c1, COMPLEX c2){ COMPLEX c; c.re=c1.re*c2.re-c1.im*c2.im; c.im=c1.re*c2.im+c2.re*c1.im; return c;}///////////////////////////////////////////////////////////**************************************************** FFT() 参数: TD为时域值 FD为频域值 power为2的幂数 返回值: 无 说明: 本函数实现快速傅立叶变换****************************************************/void FFT(COMPLEX * TD, COMPLEX * FD, int power){ int count; int i,j,k,bfsize,p; double angle; COMPLEX *W,*X1,*X2,*X; /*计算傅立叶变换点数*/ count=1<<power; /*分配运算所需存储器*/ W=(COMPLEX *)malloc(sizeof(COMPLEX)*count/2); X1=(COMPLEX *)malloc(sizeof(COMPLEX)*count); X2=(COMPLEX *)malloc(sizeof(COMPLEX)*count); /*计算加权系数*/ for(i=0;i<count/2;i++) { angle=-i*PI*2/count; W[i].re=cos(angle); W[i].im=sin(angle); } /*将时域点写入存储器*/ memcpy(X1,TD,sizeof(COMPLEX)*count); /*蝶形运算*/ for(k=0;k<power;k++) { for(j=0;j<1<<k;j++) { bfsize=1<<(power-k); for(i=0;i<bfsize/2;i++) { p=j*bfsize; X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]); X2[i+p+bfsize/2]=Mul(Sub(X1[i+p],X1[i+p+bfsize/2]),W[i*(1<<k)]); } } X=X1; X1=X2; X2=X; } /*重新排序*/ for(j=0;j<count;j++) { p=0; for(i=0;i<power;i++) { if (j&(1<<i)) p+=1<<(power-i-1); } FD[j]=X1[p]; } /*释放存储器*/ free(W); free(X1); free(X2);}/**************************************************** IFFT() 参数: FD为频域值 TD为时域值 power为2的幂数 返回值: 无 说明: 本函数利用快速傅立叶变换实现傅立叶反变换****************************************************/void IFFT(COMPLEX * FD, COMPLEX * TD, int power){ int i, count; COMPLEX *x; /*计算傅立叶反变换点数*/ count=1<<power; /*分配运算所需存储器*/ x=(COMPLEX *)malloc(sizeof(COMPLEX)*count); /*将频域点写入存储器*/ memcpy(x,FD,sizeof(COMPLEX)*count); /*求频域点的共轭*/ for(i=0;i<count;i++) x[i].im = -x[i].im; /*调用FFT*/ FFT(x, TD, power); /*求时域点的共轭*/ for(i=0;i<count;i++) { TD[i].re /= count; TD[i].im = -TD[i].im / count; } /*释放存储器*/ free(x);} 怎么会用到傅立叶变化哦,我想MFC函数里面可能有将CDC图像转化为数组的函数,只是一直没找到。顺便问一下函数CBitmap::GetBitmapBits()和GetDIBits()实现的什么功能,是怎么用的? 就是把位图数据取出来比较一下,不过你说的“没有图像”是什么概念?应该是指某种颜色吧,比如白色(RGB(255, 255, 255))。 可能没说清楚,重述一下:如何将CDC中的位图转化为数据提取出来存入一个二维数组内,象素点是白色(RGB(255, 255, 255))存入0,其他色存入1。 如何实现,最好给出源代码。刚才看帖子说函数GetDIBits()有相似功能,可以用GetDIBits把象素拷贝到buffer中,但不知道如何设置buffer的大小,还望指点。 谁能解释一下兼容的DC是干什么的? VC中从Excel读入数据成乱码怎么办 请问如何把游戏窗口隐藏起来? 内存泄漏:Use MFC in a Static Library 与 Use MFC in a Shared DLL help!help! 常见到的一些 .C 文件怎么在 VC 做的工程中使用 IE编程问题 求助:ATL中使用DateTimePicker,如何获得DateTimePicker的值?? xml 问题(在线等候,立即给分) 如何改变的窗口的背景色 vc中的位图DDB和DIB 现在学VC有前途吗?
// internal definitions#define PI (double)3.14159265359/*complex number*/
typedef struct
{
double re;
double im;
}COMPLEX;/*complex add*/
COMPLEX Add(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re+c2.re;
c.im=c1.im+c2.im;
return c;
}/*complex substract*/
COMPLEX Sub(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re-c2.re;
c.im=c1.im-c2.im;
return c;
}/*complex multiple*/
COMPLEX Mul(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re*c2.re-c1.im*c2.im;
c.im=c1.re*c2.im+c2.re*c1.im;
return c;
}
//////////////////////////////////////////////////////////
/****************************************************
FFT() 参数: TD为时域值
FD为频域值
power为2的幂数 返回值: 无 说明: 本函数实现快速傅立叶变换
****************************************************/
void FFT(COMPLEX * TD, COMPLEX * FD, int power)
{
int count;
int i,j,k,bfsize,p;
double angle;
COMPLEX *W,*X1,*X2,*X; /*计算傅立叶变换点数*/
count=1<<power;
/*分配运算所需存储器*/
W=(COMPLEX *)malloc(sizeof(COMPLEX)*count/2);
X1=(COMPLEX *)malloc(sizeof(COMPLEX)*count);
X2=(COMPLEX *)malloc(sizeof(COMPLEX)*count);
/*计算加权系数*/
for(i=0;i<count/2;i++)
{
angle=-i*PI*2/count;
W[i].re=cos(angle);
W[i].im=sin(angle);
}
/*将时域点写入存储器*/
memcpy(X1,TD,sizeof(COMPLEX)*count);
/*蝶形运算*/
for(k=0;k<power;k++)
{
for(j=0;j<1<<k;j++)
{
bfsize=1<<(power-k);
for(i=0;i<bfsize/2;i++)
{
p=j*bfsize;
X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]);
X2[i+p+bfsize/2]=Mul(Sub(X1[i+p],X1[i+p+bfsize/2]),W[i*(1<<k)]);
}
}
X=X1;
X1=X2;
X2=X;
}
/*重新排序*/
for(j=0;j<count;j++)
{
p=0;
for(i=0;i<power;i++)
{
if (j&(1<<i)) p+=1<<(power-i-1);
}
FD[j]=X1[p];
}
/*释放存储器*/
free(W);
free(X1);
free(X2);
}
/****************************************************
IFFT() 参数: FD为频域值
TD为时域值
power为2的幂数 返回值: 无 说明: 本函数利用快速傅立叶变换实现傅立叶反变换
****************************************************/
void IFFT(COMPLEX * FD, COMPLEX * TD, int power)
{
int i, count;
COMPLEX *x; /*计算傅立叶反变换点数*/
count=1<<power; /*分配运算所需存储器*/
x=(COMPLEX *)malloc(sizeof(COMPLEX)*count); /*将频域点写入存储器*/
memcpy(x,FD,sizeof(COMPLEX)*count);
/*求频域点的共轭*/
for(i=0;i<count;i++)
x[i].im = -x[i].im; /*调用FFT*/
FFT(x, TD, power); /*求时域点的共轭*/
for(i=0;i<count;i++)
{
TD[i].re /= count;
TD[i].im = -TD[i].im / count;
} /*释放存储器*/
free(x);
}
如何将CDC中的位图转化为数据提取出来存入一个二维数组内,象素点是白色(RGB(255, 255, 255))存入0,其他色存入1。 如何实现,最好给出源代码。刚才看帖子说函数GetDIBits()有相似功能,可以用GetDIBits把象素拷贝到buffer中,但不知道如何设置buffer的大小,还望指点。