nim_duilib/tool_kits/shared/zoom_image.h

86 lines
2.8 KiB
C
Raw Normal View History

2019-04-19 17:19:57 +08:00
#pragma once
//#include "util.h"
#include "log.h"
#include <windows.h>
#include <gdiplus.h>
static const std::wstring kImageJPEG = L"image/jpeg";
static const std::wstring kImagePNG = L"image/png";
static const std::wstring kImageBMP = L"image/bmp";
static const std::wstring kImageGIF = L"image/gif";
class ZoomImage
{
public:
ZoomImage(void);
~ZoomImage(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
void SetImagePath(const std::wstring &image_path);
//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ģʽ
void SetAutoZoom(bool area_zoom,int auto_max_with,int auto_max_height);
//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ģʽ
void SetSize(int width,int height);
//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
void SetRatio(float ratio);
/*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ijһ<EFBFBD><EFBFBD>ͼƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
* @param filepath:Ҫ<EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>ԴͼƬ·<EFBFBD><EFBFBD>
* @param mime_type:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
bool Zoom(const std::wstring& filepath,std::wstring mime_type=L"image/jpeg");
//<2F><>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>Ϊָ<CEAA><D6B8><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ
bool ConvertImageFormat(std::wstring& filepath, std::wstring mime_type);
//<2F><>ȡͼ<C8A1><CDBC><EFBFBD>ķ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
static Gdiplus::RotateFlipType GetRotateFlipType(Gdiplus::Image& image);
static std::wstring GetMimeType(const std::wstring& filepath);
static void GetMimeType(const std::wstring& filepath, std::wstring& mime_type_out, std::wstring& exten_out);
/*
* @brief <EFBFBD><EFBFBD>width<EFBFBD><EFBFBD>height<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡԴͼƬ<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>ͼƬ<EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
* @param filepath:ԴͼƬ·<EFBFBD><EFBFBD>
* @param image_path_out:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ·<EFBFBD><EFBFBD>
* @param width:Ҫ<EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>ԴͼƬ·<EFBFBD><EFBFBD>
* @param height:Ҫ<EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>ԴͼƬ·<EFBFBD><EFBFBD>
* @param mime_type:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static bool SavePaddingImage(const std::wstring& image_path, const std::wstring& image_path_out, int width, int height, std::wstring mime_type = L"image/jpeg");
protected:
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IsNeedZoom(int width,int height);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>浽width_<68><5F>height_
bool CalculateSize(int width_src,int height_src);
static bool GetImageCLSID(const wchar_t* format, CLSID* pCLSID);
static bool SaveImage(Gdiplus::Image& image, const std::wstring& file_path,std::wstring mime_type,long quality_num = 95);
static Gdiplus::RotateFlipType GetRotateFlipType(short orientation);
static std::wstring GetMimeType(GUID& clsid);
private:
enum ZoomType
{
by_fixed_size = 0,
by_ratio,
by_auto,by_none
};//by_fixed_size:<3A><><EFBFBD>̶<EFBFBD><CCB6>ߴ<EFBFBD>,by_ratio:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
std::wstring file_path_save_;
ZoomType zoom_type_;
bool area_zoom_; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>width*height;
int auto_max_width_;
int auto_max_height_;
int width_;
int height_;
float ratio_;
std::wstring image_path_;
};
//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>max_width * max_height<68><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>ֵΪtrue<75><65>ʾ<EFBFBD><CABE>Ҫ<EFBFBD>ü<EFBFBD><C3BC><EFBFBD>ͬʱ<CDAC><CAB1>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size
bool CalculateImageSize(const std::wstring& file, SIZE& size, int max_width, int max_height);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>Сcx * cy
void ZoomImageF(const std::wstring &src, const std::wstring &dest, int cx, int cy);