使用GDI+保存位图文件为PNG文件

摘要:
=NULL)deleteimImage;fclose(cbfBmp);fclose(cbfImage);returnFALSE;}imImage-˃保存(pStmImage,&clImageClsid);if(pStmImage==NULL){pStmBmp-˃Release();pStmImage-˃Release();GlobalUnlock(hMemBmp);GlobalFree(hMemBsmp);Global Free(hMemoImage);if(imImage!=NULL)deleteimImage;fclose(cbfImp);fclos(cbfImage);returnFALSE;}大的,大的

1.添加头文件

#include <ocidl.h>  
#include <olectl.h>
#include <stdio.h>
#include <atlconv.h>

#include <GdiPlus.h>
using namespace Gdiplus;

#pragma comment( lib , "gdiplus.lib" )

2.添加COM初始化及GDI+初始化

CoInitialize( NULL );
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

3.功能函数

int GetImageCLSID(const   WCHAR*   format,   CLSID*   pCLSID) 
{  
    //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中 
    UINT num  = 0; 
    UINT size = 0; 

    Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL; 
    GetImageEncodersSize(&num,   &size); 

    if(size == 0) 
        return FALSE;   //   编码信息不可用 

    //分配内存 
    pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); 
    if(pImageCodecInfo == NULL) 
        return FALSE;   //   分配失败 

    //获得系统中可用的编码方式的所有信息 
    GetImageEncoders(num, size, pImageCodecInfo); 

    //在可用编码信息中查找format格式是否被支持 
    for(UINT i = 0; i < num; ++i) 
    {
        //MimeType:编码方式的具体描述 
        if(wcscmp(pImageCodecInfo[i].MimeType, format) == 0) 
        { 
            *pCLSID = pImageCodecInfo[i].Clsid; 
            free(pImageCodecInfo); 
            return TRUE; 
        } 
    } 

    free(pImageCodecInfo); 
    return FALSE; 
}

BOOL BmpToPNG( char* strBmpFile, char* strPngFile )
{
    FILE* cbfBmp = fopen( strBmpFile, "rb" );
    FILE* cbfImage = fopen( strPngFile, "wb" );

    fseek( cbfBmp, 0, SEEK_END );
    int iBmpSize = ftell( cbfBmp );
    fseek( cbfBmp, 0, SEEK_SET );
    HGLOBAL hMemBmp = GlobalAlloc(GMEM_FIXED, iBmpSize);
    if (hMemBmp == NULL) return FALSE;

    IStream* pStmBmp = NULL;
    CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmBmp);
    if (pStmBmp == NULL)
    {
        GlobalFree(hMemBmp);

        fclose( cbfBmp );
        fclose( cbfImage );

        return FALSE;
    }
    BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);
    fread( pbyBmp, iBmpSize, 1, cbfBmp );

    Image* imImage = NULL;
    imImage = Image::FromStream(pStmBmp, FALSE);
    if (imImage == NULL)
    {
        GlobalUnlock(hMemBmp);
        GlobalFree(hMemBmp);

        fclose( cbfBmp );
        fclose( cbfImage );

        return FALSE;
    }
    USES_CONVERSION;
    CLSID clImageClsid;
    GetImageCLSID(A2W("image/png"), &clImageClsid);

    HGLOBAL hMemImage = GlobalAlloc(GMEM_MOVEABLE, 0);
    if (hMemImage == NULL)
    {
        pStmBmp->Release();
        GlobalUnlock(hMemBmp);
        GlobalFree(hMemBmp);
        if (imImage != NULL)
            delete imImage;

        fclose( cbfBmp );
        fclose( cbfImage );

        return FALSE;
    }
    IStream* pStmImage = NULL;
    CreateStreamOnHGlobal(hMemImage, TRUE, &pStmImage);
    if (pStmImage == NULL)
    {
        pStmBmp->Release();
        GlobalUnlock(hMemBmp);
        GlobalFree(hMemBmp);
        GlobalFree(hMemImage);
        if (imImage != NULL)
            delete imImage;

        fclose( cbfBmp );
        fclose( cbfImage );

        return FALSE;
    }   
    imImage->Save(pStmImage, &clImageClsid);
    if (pStmImage == NULL)
    {
        pStmBmp->Release();
        pStmImage->Release();
        GlobalUnlock(hMemBmp);
        GlobalFree(hMemBmp);
        GlobalFree(hMemImage);
        if (imImage != NULL)
            delete imImage;

        fclose( cbfBmp );
        fclose( cbfImage );

        return FALSE;
    }
    LARGE_INTEGER liBegin = {0};
    pStmImage->Seek(liBegin, STREAM_SEEK_SET, NULL);
    BYTE* pbyImage = (BYTE *)GlobalLock(hMemImage);
    fwrite( pbyImage, GlobalSize(hMemImage), 1, cbfImage );

    if (imImage != NULL) delete imImage;
    pStmBmp->Release();
    pStmImage->Release();
    GlobalUnlock(hMemBmp);
    GlobalUnlock(hMemImage);
    GlobalFree(hMemBmp);
    GlobalFree(hMemImage);

    fclose( cbfBmp );
    fclose( cbfImage );

    return TRUE;
}

4.COM反初始化及关闭GDI+

GdiplusShutdown(gdiplusToken);
CoUninitialize();

免责声明:文章转载自《使用GDI+保存位图文件为PNG文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇taro 消息机制iOS-SQLite数据库使用介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

30个高质量并且免费的Android图标【Android Icon素材】

有 时候你可能不喜欢默认的应用程序图标,取而代之的是一些个性化的图标。实际上对于Android设备的用户来说,改变桌面图标是可能的。你仅仅需 要一些应用程序比如LauncherPro,GO Launcher EX, Apex Launcher, Nova Launcher等来帮你完成图标的替换。网上有很多的ICON可以供你选择和挑选,但是它们过于零散,找...

ffmpeg基本功能使用

任务描述:由给定图像序列合成 24fps 视频 方案一 直接对图像进行操作,适用于图像名比较规范且默认即为所需顺序 ffmpeg -f image2 -i ./images_crop_%d.png -pix_fmt yuv420p -vcodec libx264 -r 24 -y output.mp4 方案二 将图像顺序写入一个文件列表,让ffmpeg从...

Quartz-2D绘图之图形上下文详解

  上一篇文章大概描述了下Quartz里面大体所包含的东西,但是对具体的细节实现以及如何调用相应API却没有讲。这篇文章就先讲讲图形上下文(Graphics Context)的具体操作。   所谓Graphics Context,其实就是表示了一个绘制目标,也就是你打算绘制的地方,它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息。Graphics C...

libpng warning iCCP known incorrect sRGB profile

**问题:**当在pycharm中引用pygame模块导入png图像运行后,发出警告:libpng warning: iCCP: known incorrect sRGB profile 原因:因为libpng-1.6以上版本增强了ICC profiles检查,所以发出警告。此警告可以忽略。若要消除警告则要从原图像中去掉ICCP chunk。 方法:利用p...

PHP 简易读取文件目录下的文件,生成css spirte图片

因为个人不是对PS熟悉,不清楚如何在PS中生成一张横向有序的spirte图片,使用了"css sprite V4.3"版本,生成的图片会出现压缩图片大小的情况,本想修改原作者开发的程序,但是不懂C#,只好使用PHP gd库进行生成css spirte图片。 1 <?php 2 header("Content-type: image/png");...

HBase中的压缩算法比较 GZIP、LZO、Zippy、Snappy [转]

网址: http://www.cnblogs.com/panfeng412/archive/2012/12/24/applications-scenario-summary-of-compression-algorithms.html GZIP、LZO、Zippy/Snappy是常用的几种压缩算法,各自有其特点,因此适用的应用场景也不尽相同。这里结合相关工...