zoukankan      html  css  js  c++  java
  • GdiplusUser

    /* ******* GdiplusUserU.h **********
    ********* GDI+图像操作函数声明 ********** */
    
    /* author: autumoon */
    
    #pragma once
    
    #include <afx.h>        //Cstring
    #include <gdiplus.h>
    using namespace Gdiplus;
    #include "StrDirFileU.h"
    
    #pragma comment(lib, "lib/gdiplus.lib")
    
    class CGdiplusUser
    {
    public:
        CGdiplusUser();
        ~CGdiplusUser();
    
    private:
        GdiplusStartupInput m_Gdistart; 
        ULONG_PTR m_GdiplusToken; 
        CStrDirFile sdf;
    
    private:
        int GetImageCLSID(const WCHAR* format, CLSID* pCLSID);
    
    public:
        int ConvertOneImage(const CString& strLoadFile, const CString& strSaveFile);
        int ConvertImageInDir(const CString& strDirSrc, const CString& strDirDst, const CString& strSuffix = _T(".jpg"));
    };
    /* ******* GdiplusUserU.cpp **********
    ********* GDI+图像操作函数实现 ********** */
    
    /* author: autumoon */
    
    #include "GdiplusUserU.h"
    
    CGdiplusUser::CGdiplusUser()
    {
        GdiplusStartup(&m_GdiplusToken, &m_Gdistart, NULL); 
    }
    
    CGdiplusUser::~CGdiplusUser()
    {
        GdiplusShutdown(m_GdiplusToken);
    }
    
    int CGdiplusUser::GetImageCLSID(const WCHAR* format, CLSID* pCLSID) 
    { //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中 
        UINT num = 0; 
        UINT size = 0; 
        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; 
    }
    
    int CGdiplusUser::ConvertOneImage(const CString& strLoadFile, const CString& strSaveFile)
    {
        CString strLoadExt,strSaveExt;//获取打开和保存的图像文件后缀名
        int nLenLoadExt = strLoadFile.ReverseFind('.');
        int nLenSaveExt = strSaveFile.ReverseFind('.');
        strLoadExt = strLoadFile.Right(strLoadFile.GetLength()-nLenLoadExt-1);
        strSaveExt = strSaveFile.Right(strSaveFile.GetLength()-nLenSaveExt-1);
        strLoadExt.MakeLower();
        strSaveExt.MakeLower();
        //判断文件后缀名是否正确
        if (strSaveExt!="bmp"&&strSaveExt!="jpg"&&strSaveExt!="jpeg"&&strSaveExt!="png"
            &&strSaveExt!="tiff"&&strSaveExt!="gif")
        {
            return FALSE;
        }
        if("jpg" == strSaveExt)
            strSaveExt = "jpeg";
    
        CLSID encoderClsid ;
        Image *image = NULL;
    
        //加载文件
        image = Bitmap::FromFile(strLoadFile,TRUE);
        if (image==NULL)
        {
            return FALSE;
        }
        WCHAR Wctype[1024]=L"image/";
        wcscat(Wctype,strSaveExt);
        ///读图片CLSID///////////////////////////////////////////////////////////////////////
        GetImageCLSID(Wctype,&encoderClsid);
    
        //保存图片
        BOOL bRes = TRUE;
        if(Ok != image->Save(strSaveFile,&encoderClsid,NULL))
        {
            MessageBox(NULL, _T("转换失败!"), _T("提示"), MB_ICONWARNING);
            bRes = FALSE;
        }
    
        delete image;
        return bRes;
    }
    
    int CGdiplusUser::ConvertImageInDir(const CString& strDirSrc, const CString& strDirDst, const CString& strSuffix/* = _T(".jpg")*/)
    {
        CStringArray arrFiles;
        sdf.ReadDirFiles(strDirSrc, &arrFiles, ".bmp");
        sdf.ReadDirFiles(strDirSrc, &arrFiles, ".jpg");
        sdf.ReadDirFiles(strDirSrc, &arrFiles, ".jpeg");
        sdf.ReadDirFiles(strDirSrc, &arrFiles, ".png");
        sdf.ReadDirFiles(strDirSrc, &arrFiles, ".tiff");
        sdf.ReadDirFiles(strDirSrc, &arrFiles, ".gif");
    
        sdf.CreateMuliteDirectory(strDirDst);
        for (int i = 0; i < arrFiles.GetCount(); ++i)
        {
            CString strDstFile = strDirDst + "\" + sdf.GetNameOfFile(arrFiles[i], false) + strSuffix;
            ConvertOneImage(arrFiles[i], strDstFile);
        }
    
        return 0;
    }
  • 相关阅读:
    IBM_V7000底层结构及服务器数据恢复案例详解
    vsan存储结构详解 数据恢复原理介绍
    基于linux系统,fsck后数据丢失的数据恢复方案
    SQL SERVER数据页checksum校验算法整理
    虚拟机丢失恢复数据过程;分析底层数据恢复存储数据
    15、【opencv入门】分离颜色通道&多通道图像混合
    14、【opencv入门】图像阈值化threshold
    13、【opencv入门】非线性滤波:中值滤波、双边滤波
    12、【opencv入门】线性滤波:方框滤波、均值滤波与高斯滤波
    11、【opencv入门】ROI区域 mask掩码 图像叠加&初级图像混合
  • 原文地址:https://www.cnblogs.com/autumoonchina/p/7079071.html
Copyright © 2011-2022 走看看