非API序列化ImageList_Write2和ImageList_Read2
来源:互联网 发布:newblue mac 编辑:程序博客网 时间:2024/06/05 06:31
ImageList是windows上一个比较重要的对象,可以方便的管理一串图标,其中ImageList_Write和ImageList_Read这两个API为我们提供了一个序列化ImageList的方法,但必须使用IStream接口来操作。在上次开发的一个工程中,因为使用了一个不同于IStream的二进制流类,为了使用该流进行ImageList的保存,我重新实现了自己的ImageList_Write2和ImageList_Read2.
下面贴出代码:
- BOOL HTImageListWrite2(HIMAGELIST img,CStream &s)
- {
- INT dx,dy ;
- IMAGEINFO imginf;
- BITMAP bmp;
- INT i;
- WORD bitCount=32;
- INT nTotalImages=ImageList_GetImageCount(img);
- INT nValidImages=nTotalImages;
- ImageList_GetIconSize(img,&dx,&dy);
- s <<dx
- <<dy
- <<ImageList_GetBkColor(img);//background color
- if(nTotalImages<=0){
- s<<bitCount;
- }else{
- ImageList_GetImageInfo(img,0,&imginf);
- GetObject(imginf.hbmImage,sizeof(BITMAP),(LPSTR)&bmp);
- s<<bmp.bmBitsPixel;//颜色位数
- }
- s <<nTotalImages;
- if(nTotalImages<=0){
- LOG0('E',"HTImageListWrite2","No valid iamges/r/n");
- return TRUE;
- }
- HDC hdcDevice=GetDC(NULL);
- DWORD dwImgPixelsInStreamOffset,dwImgBmpiInStreamOffset;
- LPBYTE pImgPixelsInStream;
- LPBITMAPINFOHEADER pImgBmpiInStream;
- CreateBitmapStream(hdcDevice,imginf.hbmImage,dx,dy*nValidImages,s,
- &dwImgBmpiInStreamOffset,&dwImgPixelsInStreamOffset);
- DWORD dwMaskPixelsInStreamOffset,dwMaskBmpiInStreamOffset;
- LPBYTE pMaskPixelsInStream;
- LPBITMAPINFOHEADER pMaskBmpiInStream;
- CreateBitmapStream(hdcDevice,imginf.hbmMask,dx,dy*nValidImages,s,
- &dwMaskBmpiInStreamOffset,&dwMaskPixelsInStreamOffset);
- pImgBmpiInStream=(LPBITMAPINFOHEADER)s.GetWritePoint(dwImgBmpiInStreamOffset);
- pImgPixelsInStream=(LPBYTE)s.GetWritePoint(dwImgPixelsInStreamOffset);
- pMaskBmpiInStream=(LPBITMAPINFOHEADER)s.GetWritePoint(dwMaskBmpiInStreamOffset);
- pMaskPixelsInStream=(LPBYTE)s.GetWritePoint(dwMaskPixelsInStreamOffset);
- INT byteImageWidth=pImgBmpiInStream->biSizeImage/pImgBmpiInStream->biHeight;
- INT byteMaskWidth=pMaskBmpiInStream->biSizeImage/pMaskBmpiInStream->biHeight;
- INT cy=0;
- DWORD biImgSize=pImgBmpiInStream->biSizeImage;
- DWORD biMaskSize=pMaskBmpiInStream->biSizeImage;
- LONG biImgHeight=pImgBmpiInStream->biHeight;
- LONG biMaskHeight=pMaskBmpiInStream->biHeight;
- pImgBmpiInStream->biHeight=bmp.bmHeight;
- pImgBmpiInStream->biSizeImage=byteImageWidth*bmp.bmHeight;
- pMaskBmpiInStream->biHeight=bmp.bmHeight;
- pMaskBmpiInStream->biSizeImage=byteMaskWidth*bmp.bmHeight;
- for(i=nTotalImages-1;i>=0;i--)
- {
- ImageList_GetImageInfo(img,i,&imginf);
- cy=imginf.rcImage.bottom-imginf.rcImage.top;
- GetDIBits(hdcDevice,
- imginf.hbmImage,
- bmp.bmHeight-imginf.rcImage.bottom,
- cy,
- (LPSTR)pImgPixelsInStream,
- (LPBITMAPINFO)pImgBmpiInStream,
- DIB_RGB_COLORS);
- pImgPixelsInStream+=byteImageWidth*cy;
- GetDIBits(hdcDevice,
- imginf.hbmMask,
- bmp.bmHeight-imginf.rcImage.bottom,
- cy,
- (LPSTR)pMaskPixelsInStream,
- (LPBITMAPINFO)pMaskBmpiInStream,
- DIB_RGB_COLORS);
- pMaskPixelsInStream+=byteMaskWidth*cy;
- }
- pImgBmpiInStream->biHeight=biImgHeight;
- pImgBmpiInStream->biSizeImage=biImgSize;
- pMaskBmpiInStream->biHeight=biMaskHeight;
- pMaskBmpiInStream->biSizeImage=biMaskSize;
- ::ReleaseDC(NULL,hdcDevice);
- #ifdef _TEST_
- char sz[255];
- sprintf(sz,"d://src%d.bmp",ttt++);
- FILE *f=fopen(sz,"w+b");
- BITMAPFILEHEADER bf;
- bf.bfType = 0x4D42; // "BM"
- DWORD dwPaletteSize=0;
- if(pImgBmpiInStream->biBitCount<=8)
- dwPaletteSize=(1<<pImgBmpiInStream->biBitCount)*sizeof(RGBQUAD);
- DWORD dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+pImgBmpiInStream->biSizeImage;
- bf.bfSize = dwDIBSize;
- bf.bfReserved1 = 0;
- bf.bfReserved2 = 0;
- bf.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
- fwrite((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,f); //写入位图文件头
- fwrite(pImgBmpiInStream,sizeof(BITMAPINFOHEADER)+dwPaletteSize+pImgBmpiInStream->biSizeImage,1,f);
- fclose(f);
- #endif
- return TRUE;
- }
下面是ImageList_Read2的代码:
- HIMAGELIST HTImageListRead2(HIMAGELIST img,CHTStream &s)
- {
- INT i;
- INT dx,dy,nImages;
- WORD bitCount=32;
- INT flags=ILC_COLOR32;
- COLORREF crBack;
- s >>dx//图标尺寸
- >>dy//图标尺寸
- >>crBack//背景颜色
- >>bitCount//颜色位数
- >>nImages;//图像数目
- switch(bitCount){
- case 4: flags=ILC_COLOR4;break;
- case 8: flags=ILC_COLOR8;break;
- case 16: flags=ILC_COLOR16;break;
- case 24: flags=ILC_COLOR24;break;
- case 32: flags=ILC_COLOR32;break;
- case 1:
- case 2:
- default:
- flags=ILC_COLOR;
- break;
- }
- if(NULL==img){
- img=ImageList_Create(dx,dy,flags,0,4);
- }
- if(NULL==img){
- return NULL;
- }
- ImageList_SetBkColor(img,crBack);
- if(nImages<=0){
- return img;
- }
- //当前图像列表中已经存在的图像数目。
- INT nTotalImages=ImageList_GetImageCount(img);
- //载入图像数据
- HDC hdcDevice=GetDC(NULL);
- HDC hdcSrcImg=CreateCompatibleDC(hdcDevice);
- HBITMAP hbmpSrcImg=LoadBitmapFromStream(s);//image
- HGDIOBJ hbmpOldSrcImg=SelectObject(hdcSrcImg,hbmpSrcImg);
- HDC hdcSrcMask=CreateCompatibleDC(hdcDevice);
- HBITMAP hbmpSrcMask=LoadBitmapFromStream(s);//mask
- HGDIOBJ hbmpOldSrcMask=SelectObject(hdcSrcMask,hbmpSrcMask);
- HDC hdcDstImg=CreateCompatibleDC(hdcDevice);
- HBITMAP hbmpDstImg=CreateCompatibleBitmap(hdcDevice,dx,dy);
- HGDIOBJ hbmpOldDstImg;
- HDC hdcDstMask=CreateCompatibleDC(hdcDevice);
- HBITMAP hbmpDstMask=CreateCompatibleBitmap(hdcDevice,dx,dy);
- HGDIOBJ hbmpOldDstMask;
- {
- for(i=0;i<nImages;i++)
- {
- hbmpOldDstImg=SelectObject(hdcDstImg,hbmpDstImg);
- BitBlt(hdcDstImg,0,0,dx,dy,hdcSrcImg,0,i*dy,SRCCOPY);
- SelectObject(hdcDstImg,hbmpOldDstImg);
- hbmpOldDstMask=SelectObject(hdcDstMask,hbmpDstMask);
- BitBlt(hdcDstMask,0,0,dx,dy,hdcSrcMask,0,i*dy,SRCCOPY);
- SelectObject(hdcDstMask,hbmpOldDstMask);
- ImageList_Add(img,hbmpDstImg,hbmpDstMask);
- }
- }
- SelectObject(hdcSrcMask,hbmpOldSrcMask);
- DeleteDC(hdcSrcMask);
- DeleteObject(hbmpSrcMask);
- SelectObject(hdcSrcImg,hbmpOldSrcImg);
- DeleteDC(hdcSrcImg);
- DeleteObject(hbmpSrcImg);
- DeleteDC(hdcDstMask);
- DeleteObject(hbmpDstMask);
- DeleteDC(hdcDstImg);
- DeleteObject(hbmpDstImg);
- ReleaseDC(NULL,hdcDevice);
- if(arImages){
- delete[] arImages;
- }
- return img;
- }
- 非API序列化ImageList_Write2和ImageList_Read2
- C#序列非序列化
- 序列化与非序列化
- java API------序列化和反序列化
- 最大非负的序列和
- 序列化和反序列化的概念 JDK类库中的序列化API serialVersionUID
- 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化
- JAVA中的序列化与非序列化
- 非序列化的SB服务
- 序列化和序列化
- Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化
- 非修改性序列算法之count和count_if
- 非修改性序列算法之min_element和max_element
- 3.Java核心API---序列化
- IE和非IE的API事件兼容处理
- 苹果封装的对称加密和非对称加密API
- 整数拆分成一个非减整数序列的和,求出所有的序列
- 扩增子分析解读4去嵌合体,非细菌序列,生成代表性序列和OTU表
- 网络操作系统和“鲜果在线”
- 简单数据库操作类
- 网易也推出在线照片制作了
- hibernate的使用
- 今天总算有时间整理自己的博客了
- 非API序列化ImageList_Write2和ImageList_Read2
- c#基础概念之internal 修饰符有什么作用
- 高级语言反汇编程序的函数调用过程
- 我正在学Visual Basic
- 毫秒 微妙 纳秒
- 0/1背包问题动态规划详解
- 我正在学Java
- Mysql一般安装问题
- SqlServer中取日期问题