位图的像素操作练习(2012-05-25)
2012-05-25 16:18
267 查看
很久没有较长篇的代码练习了,今天偷闲回顾练习了一下位图文件的像素操作,备忘,参考了:
水平翻转,垂直翻转,转灰度:
void BMPOpt(){
BITMAPFILEHEADER fhd;
BITMAPINFOHEADER ihd;
BYTE *pDat=NULL;
CString sfnm("e:\\t.bmp");
CFile file;
if(file.Open(sfnm, CFile::modeRead)){
try{
file.Read(&fhd, sizeof(BITMAPFILEHEADER));
file.Read(&ihd, sizeof(BITMAPINFOHEADER));
int offset = fhd.bfOffBits;
int high = ihd.biHeight,
wide = ihd.biWidth,
w4B = ((wide*3+3)/4)*4;
int bits = ihd.biBitCount;
int len = high*w4B + w4B*2;
//*wide*3;
pDat = (BYTE*)malloc(len);
if(pDat){
memset(pDat, 0, len);
}else{
throw "malloc err";
}
BYTE *pLine = pDat+high*w4B;
file.Read(pDat, len);
file.Close();
//{{// flip H::
for(int i=0; i<high/2; i++){
memcpy(pLine, pDat+i*w4B, w4B);
memcpy(pDat+i*w4B, pDat+(high-1-i)*w4B, w4B);
memcpy(pDat+(high-1-i)*w4B, pLine, w4B);
}
CFile f2;
if(f2.Open("e:\\t2.bmp", CFile::modeCreate|CFile::modeWrite)){
f2.Write(&fhd, sizeof(BITMAPFILEHEADER));
f2.Write(&ihd, sizeof(BITMAPINFOHEADER));
f2.Write(pDat, high*w4B);
f2.Close();
}
//}// flip H;;
//{ flip V::
BYTE a=0, b=0, c=0;
for(int i=0; i<high; i++){
pLine = pDat+i*w4B;
for(int j=0; j<wide/2; j++){
a=pLine[j*3];
b=pLine[j*3+1];
c=pLine[j*3+2];
int pos = (wide-1-j)*3;
pLine[j*3] = pLine[pos];
pLine[j*3+1] = pLine[pos+1];
pLine[j*3+2] = pLine[pos+2];
pLine[pos] = a;
pLine[pos+1] = b;
pLine[pos+2] = c;
}
}
CFile f3;
if(f3.Open("e:\\t3.bmp", CFile::modeCreate|CFile::modeWrite)){
f3.Write(&fhd, sizeof(BITMAPFILEHEADER));
f3.Write(&ihd, sizeof(BITMAPINFOHEADER));
f3.Write(pDat, high*w4B);
f3.Close();
}
//}} flip V;;
//{//make gray bmp, 8bits:
int gwide = (wide+3)/4*4;
int glen = high*gwide;
BYTE *pdat2 = (BYTE*)malloc(glen+4);
memset(pdat2, 0, glen);
BYTE *p8ln = NULL;
BYTE *p24ln = NULL;
//BYTE a=0, b=0, c=0;
for(int i=0; i<high; i++){
p8ln = pdat2 + i*gwide;
p24ln = pDat + i*w4B;
for(int j=0; j<wide; j++){
a=p24ln[j*3];
b=p24ln[j*3+1];
c=p24ln[j*3+2];
p8ln[j] = (a+b+c)/3;
}
}
RGBQUAD rgb[256] = {0};
int rgblen = sizeof(rgb);
fhd.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+gwide*high + sizeof(rgb);
ihd.biBitCount = 8;
ihd.biSize = sizeof(BITMAPINFOHEADER);
ihd.biSizeImage = 0;
ihd.biClrUsed = 256;
for(int n=0; n<0xff; n++){
rgb
.rgbBlue = n;
rgb
.rgbGreen = n;
rgb
.rgbRed = n;
}
CFile f4;
if(f4.Open("e:\\t4.bmp", CFile::modeCreate|CFile::modeWrite)){
f4.Write(&fhd, sizeof(BITMAPFILEHEADER));
f4.Write(&ihd, sizeof(BITMAPINFOHEADER));
f4.Write(&rgb, sizeof(rgb));
f4.Write(pdat2, glen);
f4.Close();
}
free(pdat2);
pdat2 = NULL;
//} //make gray bmp, 8bits;;
if(pDat!=NULL){
free(pDat);
pDat = NULL;
}
AfxMessageBox("OK");
}catch(CException *e){
CString sErr;
sErr.Format("Read Err\nerr code=%d", GetLastError());
//e->GetErrorMessage(sErr);
AfxMessageBox(sErr);
}
}else{
AfxMessageBox("Open file fail");
}
}
水平翻转,垂直翻转,转灰度:
void BMPOpt(){
BITMAPFILEHEADER fhd;
BITMAPINFOHEADER ihd;
BYTE *pDat=NULL;
CString sfnm("e:\\t.bmp");
CFile file;
if(file.Open(sfnm, CFile::modeRead)){
try{
file.Read(&fhd, sizeof(BITMAPFILEHEADER));
file.Read(&ihd, sizeof(BITMAPINFOHEADER));
int offset = fhd.bfOffBits;
int high = ihd.biHeight,
wide = ihd.biWidth,
w4B = ((wide*3+3)/4)*4;
int bits = ihd.biBitCount;
int len = high*w4B + w4B*2;
//*wide*3;
pDat = (BYTE*)malloc(len);
if(pDat){
memset(pDat, 0, len);
}else{
throw "malloc err";
}
BYTE *pLine = pDat+high*w4B;
file.Read(pDat, len);
file.Close();
//{{// flip H::
for(int i=0; i<high/2; i++){
memcpy(pLine, pDat+i*w4B, w4B);
memcpy(pDat+i*w4B, pDat+(high-1-i)*w4B, w4B);
memcpy(pDat+(high-1-i)*w4B, pLine, w4B);
}
CFile f2;
if(f2.Open("e:\\t2.bmp", CFile::modeCreate|CFile::modeWrite)){
f2.Write(&fhd, sizeof(BITMAPFILEHEADER));
f2.Write(&ihd, sizeof(BITMAPINFOHEADER));
f2.Write(pDat, high*w4B);
f2.Close();
}
//}// flip H;;
//{ flip V::
BYTE a=0, b=0, c=0;
for(int i=0; i<high; i++){
pLine = pDat+i*w4B;
for(int j=0; j<wide/2; j++){
a=pLine[j*3];
b=pLine[j*3+1];
c=pLine[j*3+2];
int pos = (wide-1-j)*3;
pLine[j*3] = pLine[pos];
pLine[j*3+1] = pLine[pos+1];
pLine[j*3+2] = pLine[pos+2];
pLine[pos] = a;
pLine[pos+1] = b;
pLine[pos+2] = c;
}
}
CFile f3;
if(f3.Open("e:\\t3.bmp", CFile::modeCreate|CFile::modeWrite)){
f3.Write(&fhd, sizeof(BITMAPFILEHEADER));
f3.Write(&ihd, sizeof(BITMAPINFOHEADER));
f3.Write(pDat, high*w4B);
f3.Close();
}
//}} flip V;;
//{//make gray bmp, 8bits:
int gwide = (wide+3)/4*4;
int glen = high*gwide;
BYTE *pdat2 = (BYTE*)malloc(glen+4);
memset(pdat2, 0, glen);
BYTE *p8ln = NULL;
BYTE *p24ln = NULL;
//BYTE a=0, b=0, c=0;
for(int i=0; i<high; i++){
p8ln = pdat2 + i*gwide;
p24ln = pDat + i*w4B;
for(int j=0; j<wide; j++){
a=p24ln[j*3];
b=p24ln[j*3+1];
c=p24ln[j*3+2];
p8ln[j] = (a+b+c)/3;
}
}
RGBQUAD rgb[256] = {0};
int rgblen = sizeof(rgb);
fhd.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+gwide*high + sizeof(rgb);
ihd.biBitCount = 8;
ihd.biSize = sizeof(BITMAPINFOHEADER);
ihd.biSizeImage = 0;
ihd.biClrUsed = 256;
for(int n=0; n<0xff; n++){
rgb
.rgbBlue = n;
rgb
.rgbGreen = n;
rgb
.rgbRed = n;
}
CFile f4;
if(f4.Open("e:\\t4.bmp", CFile::modeCreate|CFile::modeWrite)){
f4.Write(&fhd, sizeof(BITMAPFILEHEADER));
f4.Write(&ihd, sizeof(BITMAPINFOHEADER));
f4.Write(&rgb, sizeof(rgb));
f4.Write(pdat2, glen);
f4.Close();
}
free(pdat2);
pdat2 = NULL;
//} //make gray bmp, 8bits;;
if(pDat!=NULL){
free(pDat);
pDat = NULL;
}
AfxMessageBox("OK");
}catch(CException *e){
CString sErr;
sErr.Format("Read Err\nerr code=%d", GetLastError());
//e->GetErrorMessage(sErr);
AfxMessageBox(sErr);
}
}else{
AfxMessageBox("Open file fail");
}
}
相关文章推荐
- 位图的像素操作练习(2012-05-25)
- 位图的像素操作练习(2012-05-25)
- 32BPP窗口模式下24位位图的像素操作(1)
- bmp位图和OpenGL的像素操作
- VBO的像素操作,绘制24位位图
- BitmapEffect位图效果是简单的像素处理操作。它可以呈现下面几种特殊效果。
- 32BPP窗口模式下24位位图的像素操作(2)
- CodingTrip - 携程编程大赛 (预赛第二场)1001剪刀石头布&1003 位图像素的颜色
- 【笔记】C++ 简化位图图像操作
- 【Oracle练习】⑦第8章 数据操作与事务控制
- 文件和目录操作的思考练习(按指定path读写文件,四段小程序)
- 3-3 File类的常用操作的静态方法练习
- OpenCV学习笔记(1)——操作像素
- 算法笔记_080:蓝桥杯练习 队列操作(Java)
- 如何使用iJunOS进行Juniper/Cisco互操作练习
- Android位图操作
- OpenCV对像素的操作
- Python学习03_图片像素操作
- MySql数据库基本操作练习
- OpenGL中位图的操作(glReadPixels,glDrawPixels和glCopyPixels应用举例)