C++ CxImage库下载_编译_图片截取_压缩_调整大小_格式转换

1、CxImage库下载

官网地址:https://sourceforge.net/projects/cximage/
版本:7.02 文件:cximage702_full.7z

2、vs2019编译

将压缩包解压至文件夹。打开CxImageFull_vc10.sln。VS2019提示“升级VC++编译器和库”。点确定。按照zlib,tiff,png,mng,libpsd,libdcr,jpeg,jbig,jasper,cimage,cximagecrtdll,cximagemfcdll,demodll,demo的顺序逐个编译。

编译cximage过程中会遇到:

error C2371:“int_fast16_t”:重定义;不同的基类型。

这是因为系统有个stdint.h文件,该工程下也有这个文件CxImage/stdint.h,而且定义是一样的,查找后发现CxImage/ximadef.h包含了这个头文件stdint.h,是下面的形式

#if defined(WIN32) || defined(_WIN32_WCE)
 #include "stdint.h"
#endif

#if !defined(WIN32) && !defined(_WIN32_WCE)

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

编译cximagemfcdll过程中会遇到:
error LINK1181:无法打开输入文件".\Release\png.lib"

解决办法:
将缺少的库文件从编译的Release复制到CxImage\CxImageDLL\Release目录下。
至此,全部编译完成。新建include文件夹。将CxImage下所有.h文件复制到include文件夹。新建lib文件夹。将Release下所有内容复制到lib文件夹下。include、lib复制到自己的工程目录。配置好属性。属性配置参考CxImage的demo即可。

如果报错如下

错误  LNK2001 无法解析的外部符号 __imp_CombineRgn  ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_DeleteObject    ConsoleApplication3
错误  LNK2001 无法解析的外部符号 __imp_CreateRectRgn   ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_ReleaseDC   ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_ExtTextOutW ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_SetBkColor  ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_CreatePalette   ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_SelectPalette   ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_GetEnhMetaFilePaletteEntries    ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_GetSysColor ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_DeleteDC    ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_GetDeviceCaps   ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_DeleteEnhMetaFile   ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_GetDIBits   ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_GetEnhMetaFileHeader    ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_SetEnhMetaFileBits  ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_PlayEnhMetaFile ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_RealizePalette  ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_GetDC   ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_CreateCompatibleDC  ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_SetWinMetaFileBits  ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_SelectObject    ConsoleApplication3 
错误  LNK2001 无法解析的外部符号 __imp_CreateCompatibleBitmap  ConsoleApplication3 
错误  LNK1120 23 个无法解析的外部命令   ConsoleApplication3 

解决如下

在属性->配置属性->链接器->输入->附加依赖项:再添加上gdi32.lib和user32.lib

如果报错如下


警告  D9002   忽略未知选项“/NODEFAULTLIB:library”
错误  C3861   “_tfopen”: 找不到标识符
警告  C4996   'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
错误  C2061   语法错误: 标识符“HDC”
错误  C2061   语法错误: 标识符“HDC”
错误  C2535   “int32_t CxImage::LayerDrawAll(void)”: 已经定义或声明成员函数

解决如下添加预处理

WIN32
_WINDOWS
NDEBUG
VATI_EXTENSIONS
_CRT_SECURE_NO_DEPRECATE
_CRT_NON_CONFORMING_SWPRINTFS
_WIN32_IE=0x0501

3、图片格式转换

#include "ximage.h"
#include <iostream>

int main()
{   
        std::string imgPath = "E:\\1.jpg";

        //string转TCHAR
        TCHAR fileName[MAX_PATH];
        MultiByteToWideChar(CP_ACP, 0, (LPCSTR)imgPath.c_str(), -1, fileName, MAX_PATH);
        CxImage img1(fileName, CXIMAGE_FORMAT_JPG);
        CxImage img2(img1);
        img2.Save(_T("E:\\export.png"), CXIMAGE_FORMAT_PNG);

        return 0;
}

4、压缩
压缩方式:6(best compression)、8(default compression)、2(no compression)。best compression会比default compression产生的文件大一些,但图片质量会好一些。在上一步格式转换的时候CxImage已经采用默认压缩方式对图片进行了压缩。下面附上采用其他方式的压缩代码:

            CxImage img1;
            img1.Load(_T("E:\\1.jpg"), CXIMAGE_FORMAT_JPG);
            CxImage img2(img1);
            // 增加图片分辨率
            if (!img2.IsGrayScale()) img2.IncreaseBpp(24);
            img2.SetTransIndex(-1);
            int quality = img2.GetJpegQuality();
            // best compression
            img2.SetJpegQuality(quality | 6);
            img2.Save(_T("E:\\compress.png"), CXIMAGE_FORMAT_PNG);

5、截取

        CxImage img1;
        img1.Load(_T("E:\\1.jpg"), CXIMAGE_FORMAT_JPG);
        CxImage img2;
        // 从(10,20)位置开始截取50x50大小的图片
        int x = 10, y = 20;
        int right = x + 50;
        int bottom = y + 50;
        img1.crop(x, y, right, bottom, &img2);
        img2.Save(_T("E:\\crop.png"), CXIMAGE_FORMAT_PNG);

6、调整文件大小

        CxImage img1;
        img1.Load(_T("E:\\1.jpg"), CXIMAGE_FORMAT_JPG);
        CxImage img2(img1);
        // 调整图片文件大小为100x100
        img2.Resample(100, 100);
        img2.Save(_T("E:\\Resize.png"), CXIMAGE_FORMAT_PNG);

7、根据文件名转换出图片类型

bool FindType(const std::string& fileName, int& type)
{
     int pos = fileName.find_last_of(".");
     if (pos == std::string::npos) {
           return false;
     }

     int num = fileName.length() - pos - 1;
     std::string ext = filename.substr(pos + 1, num);

     if (ext == "bmp")     type = CXIMAGE_FORMAT_BMP;
#if CXIMAGE_SUPPORT_JPG
     else if (ext=="jpg"||ext=="jpeg") type = CXIMAGE_FORMAT_JPG;
#endif
#if CXIMAGE_SUPPORT_GIF
     else if (ext == "gif")    type = CXIMAGE_FORMAT_GIF;
#endif
#if CXIMAGE_SUPPORT_PNG
     else if (ext == "png")    type = CXIMAGE_FORMAT_PNG;
#endif
#if CXIMAGE_SUPPORT_MNG
     else if (ext=="mng"||ext=="jng") type = CXIMAGE_FORMAT_MNG;
#endif
#if CXIMAGE_SUPPORT_ICO
     else if (ext == "ico")    type = CXIMAGE_FORMAT_ICO;
#endif
#if CXIMAGE_SUPPORT_TIF
     else if (ext=="tiff"||ext=="tif") type = CXIMAGE_FORMAT_TIF;
#endif
#if CXIMAGE_SUPPORT_TGA
     else if (ext=="tga")    type = CXIMAGE_FORMAT_TGA;
#endif
#if CXIMAGE_SUPPORT_PCX
     else if (ext=="pcx")    type = CXIMAGE_FORMAT_PCX;
#endif
#if CXIMAGE_SUPPORT_WBMP
     else if (ext=="wbmp")    type = CXIMAGE_FORMAT_WBMP;
#endif
#if CXIMAGE_SUPPORT_WMF
     else if (ext=="wmf"||ext=="emf") type = CXIMAGE_FORMAT_WMF;
#endif
#if CXIMAGE_SUPPORT_J2K
     else if (ext=="j2k"||ext=="jp2") type = CXIMAGE_FORMAT_J2K;
#endif
#if CXIMAGE_SUPPORT_JBG
     else if (ext=="jbg")    type = CXIMAGE_FORMAT_JBG;
#endif
#if CXIMAGE_SUPPORT_JP2
     else if (ext=="jp2"||ext=="j2k") type = CXIMAGE_FORMAT_JP2;
#endif
#if CXIMAGE_SUPPORT_JPC
     else if (ext=="jpc"||ext=="j2c") type = CXIMAGE_FORMAT_JPC;
#endif
#if CXIMAGE_SUPPORT_PGX
     else if (ext=="pgx")    type = CXIMAGE_FORMAT_PGX;
#endif
#if CXIMAGE_SUPPORT_RAS
     else if (ext=="ras")    type = CXIMAGE_FORMAT_RAS;
#endif
#if CXIMAGE_SUPPORT_PNM
     else if (ext=="pnm"||ext=="pgm"||ext=="ppm") type = CXIMAGE_FORMAT_PNM;
#endif
     else type = CXIMAGE_FORMAT_UNKNOWN;

     return true;
}
未经允许不得转载:紫竹林-程序员中文网 » C++ CxImage库下载_编译_图片截取_压缩_调整大小_格式转换
关于我们 免责申明 意见反馈 隐私政策
程序员中文网:公益在线网站,帮助学习者快速成长!
关注微信 技术交流
推荐文章
每天精选资源文章推送
推荐文章
随时随地碎片化学习
推荐文章
发现有趣的