📄 ddib.cpp
字号:
// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "Tran.h"
#include "DDib.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDDib::CDDib()
{
}
CDDib::~CDDib()
{
}
CDDib::CDDib(BYTE *m_lpdib) //设置位图参数
{
BITMAPINFOHEADER *lpbih;
lpbi=(BITMAPINFO *) m_lpdib;
lpbih=&(lpbi->bmiHeader);
wid=lpbih->biWidth;
hei=lpbih->biHeight;
bits=lpbih->biBitCount; //每个象素所占位数,即1,4,8或24
bpl=((long)wid*bits+31)/32*4; //每行字节数
bpp=(bits+1)/8; //每个象素所占字节数,我觉得应为bpp=(bits+7)/8
colors=1<<lpbih->biBitCount; //颜色数,为每象素所占位数左移一位
if(lpbih->biBitCount>8) colors=0; //真彩色即24位位图无调色板
else if(lpbih->biClrUsed!=0)
colors=lpbih->biClrUsed; //如果biClrUsed不为0,则读取为颜色数
lpbits=&m_lpdib[sizeof(BITMAPINFOHEADER)+
colors*sizeof(RGBQUAD)]; //将lpbits指向象素首址
}
CDDib::CDDib(BITMAPINFO *m_lpbi,BYTE *m_lpbits)
{
BITMAPINFOHEADER *lpbih;
lpbi=m_lpbi;
lpbits=m_lpbits;
lpbih=&(lpbi->bmiHeader); //指向位图信息头
wid=lpbih->biWidth;
hei=lpbih->biHeight;
bits=lpbih->biBitCount;
bpl=((long)wid*bits+31)/32*4;
bpp=(bits+1)/8;
colors=1<<lpbih->biBitCount;
if(lpbih->biBitCount>8) colors=0;
else if(lpbih->biClrUsed!=0)
colors=lpbih->biClrUsed;
}
BYTE* CDDib::DibAddress(int x,int y) //取象素数据存取指针,只对8位和24位而言
{
BYTE *lp;
DWORD le;
int yy;
if (bits<8) return 0;
if ((x<0)||(y<0)||(x>=wid)||(y>=hei)) return 0;
yy = hei-1-y;
le = (DWORD) bpl*yy+bpp*x; //因为位图读取自下而上,le为读取到哪一字节的指针
lp = (BYTE *) lpbits + le;
return(lp);
}
DWORD CDDib::pixel(int x,int y,DWORD c) //点操作公用函数
{
BYTE *lp;
DWORD dd=0;
lp = DibAddress(x,y); //取象素数据指针
if (lp==NULL) return 0;
if (c==0xffffffff) {
memcpy(&dd,lp,bpp); //取象素数据
}
else {
memcpy(lp,&c,bpp); //存象素数据
}
return(dd);
}
DWORD CDDib::getpixel(int x,int y) //取象素数据
{
return(pixel(x,y,(DWORD)0xffffffff));
}
void CDDib::setpixel(int x,int y,DWORD c) //存象素数据
{
pixel(x,y,c);
}
void CDDib::getset(int x,int y,int Dx,int Dy,BYTE *buf,int flag) //矩形窗口操作函数,flag=0写入,flag=1读取
{
BYTE *lp;
int i,dw,dh,delta=0;
if ((bits<8)||(x+Dx<=0)) return;
if (x<0) { // 左边越界
delta=-x; x=0;
}
if ((x<0)||(y<0)||(x>=wid)||(y>=hei)) return;
Dx *= bpp; // 像素地址转换成字节地址
delta *= bpp; // 左边不显示的部分
dw=min(Dx,(int) bpl-bpp*x);
dh=min(Dy,(int) hei-y);
buf += delta; // 调整输入输出像素数据首地址
dw -= delta; // 调整实际显示宽度
lp = DibAddress(x,y);
for (i=0;i<dh;i++) {
if (flag==0) {
memcpy(lp,buf,dw); // 写入数据
}
else {
memcpy(buf,lp,dw); // 读出数据
}
buf += Dx; lp -= bpl;
}
}
void CDDib::getimage(int x,int y,int Dx,int Dy,BYTE *buf) //取矩形窗口象素数据
{
getset(x,y,Dx,Dy,buf,1);
}
void CDDib::setimage(int x,int y,int Dx,int Dy,BYTE *buf) //设置矩形窗口象素数据
{
getset(x,y,Dx,Dy,buf,0);
}
void CDDib::setwin(int x,int y,int Dx,int Dy,DWORD color) //矩形窗口填色
{
int i,dw,dh,k,len;
BYTE* buf;
if (bits<8) return;
if ((x<0)||(y<0)||(x>=wid)||(y>=hei)) return;
Dx *= bpp;
dw=min(Dx,(int) bpl-x*bpp);
dh=min(Dy,(int) hei-y);
dw/=bpp;
if (dw==bpp) len=dh;
else len=dw;
buf=(BYTE*)malloc(len*bpp);
if (bpp==1) memset(buf,(BYTE)color,len);
else {
for (i=0,k=0;i<len;i++,k+=bpp)
memcpy(&buf[k],&color,bpp);
}
if (dw==bpp)
setimage(x,y,1,dh,(BYTE*) buf);
else {
for (i=0;i<dh;i++) {
setimage(x,y+i,dw,1,(BYTE*) buf);
}
}
free(buf);
}
void CDDib::getpalette(int n,int *pr,int *pg,int *pb) //取象素数据
{
BYTE *hpal;
if (bits>8) return;
hpal=(BYTE *) lpbi + sizeof(BITMAPINFOHEADER);
*pb=hpal[4*n];
*pg=hpal[4*n+1];
*pr=hpal[4*n+2];
}
void CDDib::setpalette(int n,int r,int g,int b) //设置象素数据
{
BYTE *hpal;
if (bits>8) return;
hpal=(BYTE *) lpbi + sizeof(BITMAPINFOHEADER);
hpal[4*n] =(BYTE) b;
hpal[4*n+1]=(BYTE) g;
hpal[4*n+2]=(BYTE) r;
}
int CDDib::GetWidth(void)
{
return(wid);
}
int CDDib::GetHeight(void)
{
return(hei);
}
int CDDib::GetBitCount(void)
{
return(bits);
}
int CDDib::GetBytesPerLine(void)
{
return(bpl);
}
int CDDib::GetBytesPerPixel(void)
{
return(bpp);
}
int CDDib::GetColors(void)
{
return(colors);
}
long CDDib::GetSize(void)
{
return((long) bpl*hei);
}
COLORREF DWORD2CLRREF(DWORD c)
{
BYTE i;
union COLOR {
DWORD color;
COLORREF clrref;
BYTE c[4];
} col;
col.color=c;
i=col.c[0]; col.c[0]=col.c[2];
col.c[2]=i;
return(col.clrref);
}
DWORD CLRREF2DWORD(COLORREF colorref)
{
BYTE i;
union COLOR {
DWORD color;
COLORREF clrref;
BYTE c[4];
} col;
col.clrref=colorref;
i=col.c[0]; col.c[0]=col.c[2];
col.c[2]=i;
return(col.color);
}
DWORD BGR(int b,int g,int r)
{
DWORD rr,gg,bb;
rr=r; gg=g;
bb=b;
bb=bb+(gg<<8)+(rr<<16);
return(bb);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -