你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 图形图象处理与游戏编程
利用C++类实现PNG图像读写及显示(四)
 

函数Draw主要用来显示PNG图像对应的位图图像,通过指定宽度和高度,可实现图像的缩放显示。该函数主要为VC++应用程序编写。

BOOL MyPNG::Draw(CDC *pDC, int nX, int nY, int nWidth, int nHeight)

{  if( nWidth == -1 )   nWidth = cxImgSize;  if( nHeight == -1 )    nHeight= cyImgSize;

    StretchDIBits( pDC->m_hDC, nX, nY,nWidth, nHeight,0, 0,cxImgSize, cyImgSize,pPixelBuffer,&m_bmi, BI_RGB, SRCCOPY );

return true;

}

成员函数FillBitmapInfo的功能是根据PNG图像大小设置位图信息,为显示图像做准备。

bool MyPNG::FillBitmapInfo() //给变量m_bmi(位图信息头)赋值

{

    m_bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

    m_bmi.bmiHeader.biHeight=cyImgSize; m_bmi.bmiHeader.biWidth=cxImgSize;

    m_bmi.bmiHeader.biPlanes = 1;   m_bmi.bmiHeader.biBitCount = 24;

    m_bmi.bmiHeader.biCompression = 0;

    return true;

}

成员函数PngToBitmap主要实现将PNG图像数据转换成位图图像数据。

bool MyPNG::PngToBitmap()

{

BYTE *src, *dst;    BYTE r, g, b, a;

    const int cDIChannels = 3;    WORD wDIRowBytes;

    int xImg, yImg;

if (pPixelBuffer!=NULL) { delete pPixelBuffer; pPixelBuffer=NULL;   }//空间已分配则先释放

wImgRowBytes = cImgChannels * cxImgSize;//每行的字节数

wDIRowBytes = (WORD) ((cDIChannels * cxImgSize + 3L) >> 2) << 2;

pPixelBuffer=new BYTE[wDIRowBytes*cyImgSize]; //分配内存空间

if (pPixelBuffer==NULL)  {  AfxMessageBox("PNG to Bitmap:Out of memory."); return false;} //分配失败则返回

for (yImg = 0; yImg < cyImgSize; yImg++)  // 拷贝图像数据  

       {    src = pbImage + yImg * wImgRowBytes;

        dst = pPixelBuffer + (cyImgSize - yImg - 1) * wDIRowBytes ;//+ cxImgPos * cDIChannels;

        for (xImg = 0; xImg < cxImgSize; xImg++)

        { r = *src++;  g = *src++;  b = *src++;

         *dst++ = b;  *dst++ = g;  *dst++ = r; //位图的次序为BGRPNG的次序为RGB      

          if (cImgChannels == 4) { a = *src++; } //通道信息跳过

        }

    }

    return true;

}

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089