画图

16bits

 

 void *bitBuf;

  if(bmpDc==NULL)
  {
   bmpDc=CreateCompatibleDC(hdc);
  }

  if(hBmp!=NULL)
  {
   DeleteObject(hBmp);
   hBmp=NULL;
  }

  bmpWid=(pngDecoder.wid+3)&(~3);
  bmpHei=pngDecoder.hei;

  //   bmiHeader.biSize=sizeof(bmiHeader);
  //   bmiHeader.biWidth=bmpWid;
  //   bmiHeader.biHeight=-bmpHei;
  //   bmiHeader.biPlanes=1;
  //   bmiHeader.biBitCount=16;
  //   bmiHeader.biCompression=BI_BITFIELDS;
  //   bmiHeader.biSizeImage=(((((16/8)*bmpWid)+3)/4)*4)*abs(bmpHei);
  //
  //   bmiHeader.biXPelsPerMeter=2048;
  //   bmiHeader.biYPelsPerMeter=2048;
  //   bmiHeader.biClrUsed=0;
  //   bmiHeader.biClrImportant=0;
  //
  //   hBmp=CreateDIBSection(bmpDc,(BITMAPINFO *)&bmiHeader,DIB_RGB_COLORS,&bitBuf,NULL,0);


  BITMAPINFO *m_info;
  long bits = 16;
  long len = (((((bits/8)*bmpWid)+3)/4)*4)*abs(bmpHei);
  long size = len + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*3;

  m_info = (BITMAPINFO*)new BYTE[size];
  ::ZeroMemory(m_info,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*3);
  m_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*3;
  m_info->bmiHeader.biWidth = LONG(bmpWid);
  m_info->bmiHeader.biHeight = -LONG(bmpHei);
  m_info->bmiHeader.biBitCount = 16;
  m_info->bmiHeader.biPlanes = 1;
  m_info->bmiHeader.biCompression = BI_BITFIELDS;
  m_info->bmiHeader.biSizeImage = len;
  *((DWORD*)(m_info->bmiColors)) = 0xf800;
  *((DWORD*)(m_info->bmiColors)+1) = 0x07e0;
  *((DWORD*)(m_info->bmiColors)+2) = 0x001f;
  // bitBuf = (LPBYTE)(m_info->bmiColors+3);

  long m_PixelWidth = ((((m_info->bmiHeader.biWidth*m_info->bmiHeader.biBitCount/8)+3)/4)*4);

  //m_PixelWidth = ((((m_info->bmiHeader.biWidth*m_info->bmiHeader.biBitCount/8)+3)/4)*4);

  hBmp=CreateDIBSection(bmpDc,m_info,DIB_RGB_COLORS,&bitBuf,NULL,0);

  //  int x,y;
  unsigned char *buf;
  buf=(unsigned char *)bitBuf;

  //   for(y=0; y<bmpHei; y++)
  //   {
  //    for(x=0; x<bmpWid; x++)
  //    {
  //     const unsigned char *rgba;
  //     if(x<pngDecoder.wid)
  //     {
  //      rgba=pngDecoder.rgba+(y*pngDecoder.wid+x)*4;
  //     }
  //     else
  //     {
  //      rgba=pngDecoder.rgba+(y*pngDecoder.wid+pngDecoder.wid-1)*4;
  //     }
  //     //buf[(y*bmpWid+x)*3  ]=rgba[2];
  //     //buf[(y*bmpWid+x)*3+1]=rgba[1];
  //     //buf[(y*bmpWid+x)*3+2]=rgba[0];
  //     buf[(y*bmpWid+x)*2+1] = (rgba[0]>>3)&0x1f|0xe0&(rgba[1]<<3);
  //     buf[(y*bmpWid+x)*2] = (rgba[1]>>5)&0x7|(rgba[2])&0xf8;
  //    }
  //   }

  int alpha;
  int ialpha;

  const unsigned char *rgba;
  rgba = pngDecoder.rgba;

  for(long i = 0;i<bmpHei*bmpWid;i++)
  {


   alpha = *(rgba+3);


   unsigned char buffer[3];

   buf[0] = 0x1f;
   //  buf[1] = 0xf8;
   buf[1] = 0x00;
   ialpha = 256 - alpha;

   //  if( alpha )
   {

    buffer[0] = (buf[0]&0x1f)<<3 ;
    buffer[1] = ((buf[0]>>5)+((buf[1]<<5)))<<2;
    buffer[2] = (buf[1]>>3)<<3 ;

    buffer[0] = ((*(rgba+2))*alpha+buffer[0]*ialpha)>>8;
    buffer[1] = ((*(rgba+1))*alpha+buffer[1]*ialpha)>>8;
    buffer[2] = ((*(rgba))*alpha+buffer[2]*ialpha)>>8;
    //     buffer[0] = (*(rgba+2));
    //     buffer[1] = (*(rgba+1));
    //     buffer[2] = (*(rgba));
    buf[0] = (buffer[0]>>3)&0x1f|0xe0&(buffer[1]<<3);
    buf[1] = (buffer[1]>>5)&0x7|(buffer[2])&0xf8;
   }

 

   buf +=  2;
   rgba += 4;

  }

  if(bmpDc!=NULL && hBmp!=NULL)
  {
   HBITMAP hBmpSave;
   hBmpSave=(HBITMAP)SelectObject(bmpDc,hBmp);
   BitBlt(hdc,pRect->left,pRect->top,pRect->right,pRect->bottom,bmpDc,0,0,SRCCOPY);
   SelectObject(bmpDc,hBmpSave);
  }
 }

 

 

 

24bits

 

BITMAPINFOHEADER bmiHeader;
  void *bitBuf;

  if(bmpDc==NULL)
  {
   bmpDc=CreateCompatibleDC(hdc);
  }

  if(hBmp!=NULL)
  {
   DeleteObject(hBmp);
   hBmp=NULL;
  }

  bmpWid=(pngDecoder.wid+3)&(~3);
  bmpHei=pngDecoder.hei;

  bmiHeader.biSize=sizeof(bmiHeader);
  bmiHeader.biWidth=bmpWid;
  bmiHeader.biHeight=-bmpHei;
  bmiHeader.biPlanes=1;
  bmiHeader.biBitCount=24;
  bmiHeader.biCompression=BI_RGB;
  bmiHeader.biSizeImage=0;
  bmiHeader.biXPelsPerMeter=2048;
  bmiHeader.biYPelsPerMeter=2048;
  bmiHeader.biClrUsed=0;
  bmiHeader.biClrImportant=0;

  hBmp=CreateDIBSection(bmpDc,(BITMAPINFO *)&bmiHeader,DIB_RGB_COLORS,&bitBuf,NULL,0);

  int x,y;
  unsigned char *buf;
  buf=(unsigned char *)bitBuf;
  for(y=0; y<bmpHei; y++)
  {
   for(x=0; x<bmpWid; x++)
   {
    const unsigned char *rgba;
    if(x<pngDecoder.wid)
    {
     rgba=pngDecoder.rgba+(y*pngDecoder.wid+x)*4;
    }
    else
    {
     rgba=pngDecoder.rgba+(y*pngDecoder.wid+pngDecoder.wid-1)*4;
    }
    buf[(y*bmpWid+x)*3  ]=rgba[2];
    buf[(y*bmpWid+x)*3+1]=rgba[1];
    buf[(y*bmpWid+x)*3+2]=rgba[0];
   }
  }

  //InvalidateRect(hWnd,NULL,FALSE);
  //hdc=GetDC(hWnd);
  if(bmpDc!=NULL && hBmp!=NULL)
  {
   HBITMAP hBmpSave;
   //RECT rect;
   int x,y;

   hBmpSave=(HBITMAP)SelectObject(bmpDc,hBmp);
   //GetClientRect(hWnd,pRect);

   for(y=pRect->top; y<pRect->bottom; y+=bmpHei)
   {
    for(x=pRect->left; x<pRect->right; x+=bmpWid)
    {
     BitBlt(hdc,x,y,pRect->right,pRect->bottom,bmpDc,0,0,SRCCOPY);
    }
   }

   SelectObject(bmpDc,hBmpSave);
  }
 }

 

转载于:https://www.cnblogs.com/abo77281/archive/2009/12/07/1618874.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值