#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;
}