cxImageUser

#pragma once
#include <string>
#include "ximage.h"
#include "ximagif.h"
#include "xiofile.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

#ifdef _DEBUG
#pragma comment(lib, "cximage//db//cximage.lib")
#pragma comment(lib, "cximage//db//jasper.lib")
#pragma comment(lib, "cximage//db//jbig.lib")
#pragma comment(lib, "cximage//db//jpeg.lib")
#pragma comment(lib, "cximage//db//libdcr.lib")
#pragma comment(lib, "cximage//db//libpsd.lib")
#pragma comment(lib, "cximage//db//mng.lib")
#pragma comment(lib, "cximage//db//png.lib")
#pragma comment(lib, "cximage//db//tiff.lib")
#pragma comment(lib, "cximage//db//zlib.lib")
#else
#pragma comment(lib, "cximage//cximage.lib") 
#pragma comment(lib, "cximage//jasper.lib")
#pragma comment(lib, "cximage//jbig.lib")
#pragma comment(lib, "cximage//jpeg.lib")
#pragma comment(lib, "cximage//libdcr.lib")
#pragma comment(lib, "cximage//libpsd.lib")
#pragma comment(lib, "cximage//mng.lib")
#pragma comment(lib, "cximage//png.lib")
#pragma comment(lib, "cximage//tiff.lib")
#pragma comment(lib, "cximage//zlib.lib")
#endif

class CxImageUser
{
public:
    CxImageUser();
    ~CxImageUser();

    static bool gif2jpg(const std::wstring& strSrcFile, const std::wstring& strDstFile);
    static bool png2jpg(const std::wstring& strSrcFile, const std::wstring& strDstFile);
    static bool ResizeGif(const std::wstring& strSrcFile, const std::wstring& strDstFile, const int& nWidth, const int& nHeight);
};
#include "cxImageUser.h"
#include "StdStrFile.h"

bool CxImageUser::gif2jpg(const std::wstring& strSrcFile, const std::wstring& strDstFile)
{
    CxImage  image; 
    //gif -> jpg 
    image.Load(strSrcFile.c_str(), CXIMAGE_SUPPORT_GIF); 
    if (image.IsValid())
    { 
        if(!image.IsGrayScale()) image.IncreaseBpp(24); 
        image.SetJpegQuality(80); 
        image.Save(strDstFile.c_str(),CXIMAGE_FORMAT_JPG); 
    }

    return true;
}

bool CxImageUser::png2jpg( const std::wstring& strSrcFile, const std::wstring& strDstFile )
{
    CxImage  image; 
    //png -> jpg 
    image.Load(strSrcFile.c_str(), CXIMAGE_FORMAT_PNG); 
    if (image.IsValid()){ 
        if(!image.IsGrayScale()) image.IncreaseBpp(24); 
        image.SetJpegQuality(80); 
        image.Save(strDstFile.c_str(),CXIMAGE_FORMAT_JPG); 
    }
    image.GetExifInfo();

    return true;
}

bool CxImageUser::ResizeGif(const std::wstring& strSrcFile, const std::wstring& strDstFile, const int& nWidth, const int& nHeight)
{
#if CXIMAGE_SUPPORT_DECODE && CXIMAGE_SUPPORT_ENCODE && CXIMAGE_SUPPORT_GIF
    CxImage img;
    img.Load(strSrcFile.c_str(), CXIMAGE_FORMAT_GIF);

    if (!img.IsValid())
    {
        return false;
    }

    //这样做只能保留第一帧
//     img.Resample(nWidth, nHeight);
//     img.Save(strDstFile.c_str(), CXIMAGE_FORMAT_GIF);

    int iNumFrames = img.GetNumFrames();
    CxImage** imgSave = new CxImage*[iNumFrames];

    for (int i = 0; i < iNumFrames; i++)
    {
        CxImage* newImage = new CxImage();
        newImage->SetFrame(i);
        newImage->Load(strSrcFile.c_str(), CXIMAGE_FORMAT_GIF);
        newImage->Resample(nWidth, nHeight);
        if (0 == newImage->GetNumColors())
        {
            imgSave[i]->DecreaseBpp(8, true);
        }
        imgSave[i] = newImage;
    }

    CxIOFile hFile;
    std::string Method = "wb";
    std::wstring  stempmd = CStdStr::s2ws(Method);
    LPCWSTR wMethod = stempmd.c_str();
    bool BFlag = hFile.Open(strDstFile.c_str(), wMethod);

    CxImageGIF multiimage;

    multiimage.SetLoops(-1);
    multiimage.SetFrameDelay(img.GetFrameDelay());
    multiimage.SetDisposalMethod(img.GetDisposalMethod());
    multiimage.Encode(&hFile, imgSave, iNumFrames, false, false);

    hFile.Close();

    //释放资源
    for (int i = 0; i < iNumFrames; ++i)
    {
        if (imgSave[i])
        {
            delete imgSave[i];
            imgSave[i] = nullptr;
        }
    }
    if (imgSave)
    {
        delete[] imgSave;
        imgSave = nullptr;
    }
    
#endif

    return true;
}

 

posted @ 2017-06-22 15:35  秋月的私语  阅读(292)  评论(0编辑  收藏  举报