截取 部分 BMP图片

henry.x 2012-08-17 02:44:16
不想用DC ,想去遍历 数据 进行截取 bmp 图片的 一部分 ,但是不知道 如何 入手 ,请高人 解答
...全文
157 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2012-08-25
  • 打赏
  • 举报
回复
#6#7怎么没有了?

//left,top,right,down
//input file 'clouds.bmp' 640,480,256
//output file 'tmp.bmp'
void CDrawbmpView::SavePartialBmp(int Xstart,int Ystart,int Xend,int Yend)
{
FILE *bmp;
bmp=fopen("clouds.BMP","rb");
fseek(bmp,0L,SEEK_END);
LONG filelen=ftell(bmp);
fseek(bmp,0L,SEEK_SET);
BYTE *buffer=new BYTE[filelen];
fread(buffer,sizeof(char),filelen,bmp);
fclose(bmp);
//
LPBITMAPFILEHEADER pBMPfile=(LPBITMAPFILEHEADER) buffer;
LPBITMAPINFOHEADER pBMPinfo=(LPBITMAPINFOHEADER) (buffer+sizeof(BITMAPFILEHEADER));
int colors=0;//
// if(pBMPinfo->biClrUsed != 256 || pBMPinfo->biClrUsed ==0)
colors=1 << pBMPinfo->biBitCount;//1<<8
if(colors != 256 ) return;
//width
WORD width=(WORD)pBMPinfo->biWidth;
BYTE rest;
rest=width %4;
if( rest != 0) width += 4-rest;
//
WORD height=(WORD)pBMPinfo->biHeight;
BYTE *bitsAt=buffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colors*sizeof(RGBQUAD);//=4;
//
RGBQUAD *rgb=(RGBQUAD*)(buffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
// check edges
if(Xstart < 0 ) Xstart=0;
if(Xend > width ) Xend=width;
if(Xend <= Xstart ) return;
//
if(Ystart < 0 ) Ystart=0;
if(Yend > height ) Yend=height;
if(Yend <= Ystart ) return;
// new width
WORD tmpWid=Xend-Xstart;
rest=tmpWid %4;
if( rest != 0)
{// new end
tmpWid += 4-rest;
if(Xend==width) Xstart=Xend-tmpWid;
else Xend=Xstart+tmpWid;
}
WORD tmpHei=Yend-Ystart;
// get new bits
BYTE *tmpBits=new BYTE[tmpWid*tmpHei];
for(int hei=Ystart;hei < Yend;hei++)
{
for(int wid=Xstart;wid < Xend;wid++)
{//vertical flip
tmpBits[(Yend-1-hei)*tmpWid+wid-Xstart]=bitsAt[(height-1-hei)*width+wid];
}
}
//
FILE *fp;
fp = fopen("tmp.bmp","wb");
// header
pBMPfile->bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+
colors * sizeof(RGBQUAD)+tmpWid*tmpHei;
fwrite(pBMPfile, 1, sizeof(BITMAPFILEHEADER), fp);
// info header
pBMPinfo->biWidth=tmpWid;
pBMPinfo->biHeight=tmpHei;
pBMPinfo->biSizeImage=tmpWid*tmpHei;
fwrite(pBMPinfo, 1, sizeof(BITMAPINFOHEADER),fp);
// Pallete
fwrite(rgb, 1, colors * sizeof(RGBQUAD),fp);
// dibs
fwrite(tmpBits,1,tmpWid*tmpHei,fp);
fclose(fp);
// free
if(tmpBits) delete [] tmpBits;
if(buffer) delete [] buffer;
}
schlafenhamster 2012-08-24
  • 打赏
  • 举报
回复
256色的例子:
//left,top,right,down
//input file 'clouds.bmp' 640,480,256
//output file 'tmp.bmp'
void CDrawbmpView::SavePartialBmp(int Xstart,int Ystart,int Xend,int Yend)
{
FILE *bmp;
bmp=fopen("clouds.BMP","rb");
fseek(bmp,0L,SEEK_END);
LONG filelen=ftell(bmp);
fseek(bmp,0L,SEEK_SET);
BYTE *buffer=new BYTE[filelen];
fread(buffer,sizeof(char),filelen,bmp);
fclose(bmp);
//
LPBITMAPFILEHEADER pBMPfile=(LPBITMAPFILEHEADER) buffer;
LPBITMAPINFOHEADER pBMPinfo=(LPBITMAPINFOHEADER) (buffer+sizeof(BITMAPFILEHEADER));
int colors=0;//
// if(pBMPinfo->biClrUsed != 256 || pBMPinfo->biClrUsed ==0)
colors=1 << pBMPinfo->biBitCount;//1<<8
if(colors != 256 ) return;
//width
WORD width=(WORD)pBMPinfo->biWidth;
BYTE rest;
rest=width %4;
if( rest != 0) width += 4-rest;
//
WORD height=(WORD)pBMPinfo->biHeight;
BYTE *bitsAt=buffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colors*sizeof(RGBQUAD);//=4;
//
RGBQUAD *rgb=(RGBQUAD*)(buffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
// check edges
if(Xstart < 0 ) Xstart=0;
if(Xend > width ) Xend=width;
if(Xend <= Xstart ) return;
//
if(Ystart < 0 ) Ystart=0;
if(Yend > height ) Yend=height;
if(Yend <= Ystart ) return;
// new width
WORD tmpWid=Xend-Xstart;
rest=tmpWid %4;
if( rest != 0)
{// new end
tmpWid += 4-rest;
if(Xend==width) Xstart=Xend-tmpWid;
else Xend=Xstart+tmpWid;
}
WORD tmpHei=Yend-Ystart;
// get new bits
BYTE *tmpBits=new BYTE[tmpWid*tmpHei];
for(int hei=Ystart;hei < Yend;hei++)
{
for(int wid=Xstart;wid < Xend;wid++)
{//vertical flip
tmpBits[(Yend-1-hei)*tmpWid+wid-Xstart]=bitsAt[(height-1-hei)*width+wid];
}
}
//
FILE *fp;
fp = fopen("tmp.bmp","wb");
// header
pBMPfile->bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+
colors * sizeof(RGBQUAD)+tmpWid*tmpHei;
fwrite(pBMPfile, 1, sizeof(BITMAPFILEHEADER), fp);
// info header
pBMPinfo->biWidth=tmpWid;
pBMPinfo->biHeight=tmpHei;
pBMPinfo->biSizeImage=tmpWid*tmpHei;
fwrite(pBMPinfo, 1, sizeof(BITMAPINFOHEADER),fp);
// Pallete
fwrite(rgb, 1, colors * sizeof(RGBQUAD),fp);
// dibs
fwrite(tmpBits,1,tmpWid*tmpHei,fp);
fclose(fp);
// free
if(tmpBits) delete [] tmpBits;
if(buffer) delete [] buffer;
}
schlafenhamster 2012-08-24
  • 打赏
  • 举报
回复
256色的例子:
//left,top,right,down
//input file 'clouds.bmp' 640,480,256
//output file 'tmp.bmp'
void CDrawbmpView::SavePartialBmp(int Xstart,int Ystart,int Xend,int Yend)
{
FILE *bmp;
bmp=fopen("clouds.BMP","rb");
fseek(bmp,0L,SEEK_END);
LONG filelen=ftell(bmp);
fseek(bmp,0L,SEEK_SET);
BYTE *buffer=new BYTE[filelen];
fread(buffer,sizeof(char),filelen,bmp);
fclose(bmp);
//
LPBITMAPFILEHEADER pBMPfile=(LPBITMAPFILEHEADER) buffer;
LPBITMAPINFOHEADER pBMPinfo=(LPBITMAPINFOHEADER) (buffer+sizeof(BITMAPFILEHEADER));
int colors=0;//
// if(pBMPinfo->biClrUsed != 256 || pBMPinfo->biClrUsed ==0)
colors=1 << pBMPinfo->biBitCount;//1<<8
if(colors != 256 ) return;
//width
WORD width=(WORD)pBMPinfo->biWidth;
BYTE rest;
rest=width %4;
if( rest != 0) width += 4-rest;
//
WORD height=(WORD)pBMPinfo->biHeight;
BYTE *bitsAt=buffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colors*sizeof(RGBQUAD);//=4;
//
RGBQUAD *rgb=(RGBQUAD*)(buffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
// check edges
if(Xstart < 0 ) Xstart=0;
if(Xend > width ) Xend=width;
if(Xend <= Xstart ) return;
//
if(Ystart < 0 ) Ystart=0;
if(Yend > height ) Yend=height;
if(Yend <= Ystart ) return;
// new width
WORD tmpWid=Xend-Xstart;
rest=tmpWid %4;
if( rest != 0)
{// new end
tmpWid += 4-rest;
if(Xend==width) Xstart=Xend-tmpWid;
else Xend=Xstart+tmpWid;
}
WORD tmpHei=Yend-Ystart;
// get new bits
BYTE *tmpBits=new BYTE[tmpWid*tmpHei];
for(int hei=Ystart;hei < Yend;hei++)
{
for(int wid=Xstart;wid < Xend;wid++)
{//vertical flip
tmpBits[(Yend-1-hei)*tmpWid+wid-Xstart]=bitsAt[(height-1-hei)*width+wid];
}
}
//
FILE *fp;
fp = fopen("tmp.bmp","wb");
// header
pBMPfile->bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+
colors * sizeof(RGBQUAD)+tmpWid*tmpHei;
fwrite(pBMPfile, 1, sizeof(BITMAPFILEHEADER), fp);
// info header
pBMPinfo->biWidth=tmpWid;
pBMPinfo->biHeight=tmpHei;
pBMPinfo->biSizeImage=tmpWid*tmpHei;
fwrite(pBMPinfo, 1, sizeof(BITMAPINFOHEADER),fp);
// Pallete
fwrite(rgb, 1, colors * sizeof(RGBQUAD),fp);
// dibs
fwrite(tmpBits,1,tmpWid*tmpHei,fp);
fclose(fp);
// free
if(tmpBits) delete [] tmpBits;
if(buffer) delete [] buffer;
}
zhouzhipen 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

想绕过DC应该是不可能的。
[/Quote]

只是读取,还是可以的,但需要解析文件头,计算数据偏移。
whucv 2012-08-17
  • 打赏
  • 举报
回复
可以利用OpenCv或CxImage库,或者自己活得bmp的数据头,进行操作也可以,不过OpenCv有直接输出感兴趣区的功能很方便。
schlafenhamster 2012-08-17
  • 打赏
  • 举报
回复
读bmp文件数据。
wltg2001 2012-08-17
  • 打赏
  • 举报
回复
想绕过DC应该是不可能的。
henry.x 2012-08-17
  • 打赏
  • 举报
回复
真心 就指教 ..!!!!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧