⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddib.cpp

📁 将JPEG图像解压为BMP图像。 内含图像处理的一些基本函数。
💻 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 + -