C++基于Windows GDI自己绘制BMP图像
程序员文章站
2022-03-29 08:06:42
...
无意中看到这个帖子:http://news.cnblogs.com/n/501488/
仿照大神代码研究了一下,自己按照位图格式填充到数据区生成的图片。可能位图信息填充不完善会有缺失,不过确实可以用照片查看器或者绘图打开查看。
#include <iostream>
#include <Windows.h>
#include <cmath>
#include <cstdlib>
#include <WinGDI.h>
#define DIM 1024
#define DM1 (DIM-1)
#define _sq(x) ((x)*(x)) // square //平方
#define _cb(x) abs ((x)*(x)*(x)) // absolute value of cube //立方绝对值
#define _cr(x) (unsigned char)(pow ((x),1.0/3.0)) // cube root 立方根
unsigned char RD (int,int);
unsigned char GR (int,int);
unsigned char BL (int,int);
unsigned char RD (int i,int j)
{
// return (char)(_sq(cos(atan2((double)j-512,(double)i-512)/2))*255);
float s=3./(j+99);
float y=(j+sin ((i*i+_sq (j-700)*5)/100./DIM)*35)*s;
return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}
unsigned char GR (int i,int j)
{
// return (char)(_sq(cos(atan2((double)j-512,i-512)/2-2*acos((double)-1)/3))*255);
float s=3./(j+99);
float y=(j+sin ((i*i+_sq (j-700)*5)/100./DIM)*35)*s;
return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;
}
unsigned char BL (int i,int j)
{
// return (char)(_sq(cos(atan2((double)j-512,i-512)/2+2*acos((double)-1)/3))*255);
float s=3./(j+99);
float y=(j+sin ((i*i+_sq (j-700)*5)/100./DIM)*35)*s;
return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;
}
void Pixel_write(int,int);
FILE *fp;
int main()
{
fp = fopen ("MathPic.bmp","wb");
BITMAP bmp;
BITMAPINFOHEADER bih; //位图信息头
memset(&bih, 0, sizeof(bih));
bih.biBitCount = 24;
bih.biCompression = BI_RGB;//表示不压缩
bih.biHeight = 1024;
bih.biPlanes = 1; //位平面数,必须为1
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage =1024*1024;
bih.biWidth = 1024;
BITMAPFILEHEADER bfh; //位图文件头
memset(&bfh, 0, sizeof(bfh));
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bfh.bfSize = bfh.bfOffBits + 1024 * 1024;
bfh.bfType = (WORD)0x4d42;//必须表示"BM"
fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);
fwrite(&bih, 1, sizeof(bih), fp);
for(int j=0;j<DIM;j++)
for(int i=0;i<DIM;i++)
Pixel_write (i,j);
fclose(fp);
return 0;
}
void Pixel_write (int i, int j){
static unsigned char color[3];
color[0] = RD (i,j)&255;
color[1] = GR (i,j)&255;
color[2] = BL (i,j)&255;
fwrite (color, 1, 3, fp);
}
生成图片如下:
注释部分的一张为:
上一篇: jquery+mobile有哪些传参方式
下一篇: Linux系统基础篇(二)