批量缩放PNG图片.
最近需要缩放N多图片,
找遍了互联网也没有找到方便使用的批量缩放工具..
趁着周末写一个练手..
#include <iostream> #include <vector> #include <list> #include <string> #include <iterator> #include <functional> #include <memory> #include <fstream> #include <sstream> #include <Shlwapi.h> #include <Windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") #pragma comment(lib, "Shlwapi.lib") inline std::wstring getDirectory(const std::wstring &fullname) { auto findIndex = fullname.find_last_of('\\'); return findIndex != std::wstring::npos ? fullname.substr(, findIndex + ) : std::wstring(); } inline std::wstring getFullName(const std::wstring &fullname) { auto findIndex = fullname.find_last_of('\\'); return findIndex != std::wstring::npos ? fullname.substr(findIndex + ) : std::wstring(); } template <class T1, class T2> inline T1 parseTo(const T2 &t) { static std::wstringstream sstream; T1 r; sstream << t; sstream >> r; sstream.clear(); return r; } CLSID findCLSID(const std::wstring &format) { CLSID clsid = { }; auto num = 0u; auto size = 0u; Gdiplus::GetImageEncodersSize(&num, &size); ) { auto pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size)); if (pImageCodecInfo != nullptr) { GetImageEncoders(num, size, pImageCodecInfo); ; j< num; ++j) { if (format == pImageCodecInfo[j].MimeType) { clsid = pImageCodecInfo[j].Clsid; break; } } free(pImageCodecInfo); } } return clsid; } void forEachFileList( const std::wstring &fileListName, const std::function<void (const std::wstring &)> &handler) { std::wifstream ifile(fileListName); if (ifile) { std::wstring fileName; while (std::getline(ifile, fileName)) { handler(fileName); } ifile.close(); } } int createSaveDirector(const std::wstring &director) { auto result = true; if (!PathFileExists(director.c_str())) { result = CreateDirectory(director.c_str(), nullptr) != ; } return result; } void saveImage(Gdiplus::Bitmap *pImage, const CLSID &clsid, const std::wstring &saveFile) { auto director = getDirectory(saveFile); director.append(L"\\save\\"); if (createSaveDirector(director)) { director.append(getFullName(saveFile)); std::wcout << L"save image file: " << director << std::endl; pImage->Save(director.c_str(), &clsid); } } void scaleImage(const std::wstring &fileName, const CLSID &clsid, float scalex, float scaley) { Gdiplus::Bitmap image(fileName.c_str()); if (image.GetLastStatus() == Gdiplus::Ok) { auto srcWidth= image.GetWidth(); auto srcHeight = image.GetHeight(); auto dstWidth = srcWidth * scalex; auto dstHeight = srcHeight * scaley; Gdiplus::Bitmap newImage((u_int)dstWidth, (u_int)dstHeight); Gdiplus::Graphics graphics(&newImage); graphics.DrawImage(&image, 0u, 0u, dstWidth, dstHeight); saveImage(&newImage, clsid, fileName); } } void run(const std::wstring &fileList, float scalex, float scaley) { u_long token; Gdiplus::GdiplusStartupInput input; Gdiplus::GdiplusStartup(&token, &input, nullptr); { auto clsid = findCLSID(L"image/png"); || clsid.Data2 != || clsid.Data3 != ) { forEachFileList( fileList, std::bind(scaleImage, std::placeholders::_1, clsid, scalex, scaley)); } } Gdiplus::GdiplusShutdown(token); } int wmain(int argn, wchar_t *argc[]) { std::locale(std::locale::global(std::locale("chs"))); std::wcout << argn << std::endl; ) { std::wcout << L"参数格式: " << L"imglist.txt scalex scaley" << std::endl; } else { run(argc[], parseTo<]), parseTo<])); } std::wcout << L"run done." << std::endl; std::wcin.get(); ; }
使用说明:
在控制台下运行即可.
运行需要三个参数分别是: 需要缩放的图片路径列表, x缩放之, y缩放值.
第一个参数是一个包含了需要被缩放的图片路径列表, 是纯文本文件, 可以用cmd命令来生成:
for /r %%i in(.,*) do echo %%i>>.\filelist.txt
路径列表图
缩放0.1效果图
批量缩放PNG图片.的更多相关文章
- 批量翻转PNG图片
用了好几个软件都不好用. 要么不能翻转PNG, 要么翻转之后没有透明度了. 基本上全是图形界面, 要鼠标批量拖放. 所以, 还是自己动手, 写一个批量png翻转工具. #include <ios ...
- 批量下载网站图片的Python实用小工具
定位 本文适合于熟悉Python编程且对互联网高清图片饶有兴趣的筒鞋.读完本文后,将学会如何使用Python库批量并发地抓取网页和下载图片资源.只要懂得如何安装Python库以及运行Python程序, ...
- Magnifier.js - 支持鼠标滚轮缩放的图片放大镜效果
Magnifier.js 是一个 JavaScript 库,能够帮助你在图像上实现放大镜效果,支持使用鼠标滚轮放大/缩小功能.放大的图像可以显示在镜头本身或它的外部容器中.Magnifier.js 使 ...
- jQuery实现等比例缩放大图片
在布局页面时,有时会遇到大图片将页面容器“撑破”的情况,尤其是加载外链图片(通常是通过采集的外站的图片).那么本文将为您讲述使用jQuery如何按比例缩放大图片,让大图片自适应页面布局. 通常我们 ...
- Android调用相册拍照控件实现系统控件缩放切割图片
android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家 package cn.m15.test; import java.io.By ...
- Android实现支持缩放平移图片
本文主要用到了以下知识点 Matrix GestureDetector 能够捕捉到长按.双击 ScaleGestureDetector 用于检测缩放的手势 自由的缩放 需求:当图片加载时,将图片在屏幕 ...
- Android 调用相册 拍照 实现系统控件缩放 切割图片
android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test; import java.io.B ...
- Zencart批量删除无图片产品
Zencart批量删除无图片产品 2012-04-23 07:26:18| 分类: 默认分类 |字号 订阅 转自 http://zhongjia33.blog.163.com/blog/#m=0 ...
- LODOP用ADD_PRINT_IMAGE语句缩放打印图片
LODOP提高输出图片质量的方法:1.用ADD_PRINT_IMAGE语句打印图片,而且img元素的width和height属性要去掉或者设置足够大,这样就可以让下载引擎传给Lodop图片质量足够好; ...
随机推荐
- RedHat/CentOS系统信息查看命令大全
系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo ...
- 佛山Uber优步司机奖励政策(2月1日~2月7日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- python Day 1 - 搭建开发环境
搭建开发环境 首先,确认系统安装的Python版本是2.7.x: $ python --version Python 2.7.5 然后,安装开发Web App需要的第三方库: 前端模板引擎jinja2 ...
- 谈JAVA的内存回收(一)
谈JAVA的内存回收 程序员需要通过关键字new创建Java对象,即可视为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间,当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除他 ...
- Android Studio 环境配置优化
一.插件 .ignore: 版本控制忽略文件高亮和补齐ADB Idea: ctrl + Shift + A 查找中添加常用卸载安装app的一些操作,无需命令行Android ButterKnife Z ...
- 实时的.NET程序错误监控产品Exceptionless开源了
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:实时的.NET程序错误监控产品Exceptionless开源了.
- TortoiseSVN客户端重新设置用户名和密码[转]
在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了. 不过,如果 ...
- 读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design
本章以山寨版Twitter为例介绍HBase Schema设计模式.广义的HBase Schema设计不仅仅包含创建表时指定项,还应该综合考虑Column families/Column qualif ...
- 【Oracle】OCR的备份和恢复之导出导入
使用导出导入进行OCR的备份和恢复: 在对集群做调整前.如:增删节点等操作前,应该对OCR进行一次备份.能够使用export备份到指定文件. 实验环境: OS:OEL5.6 RAC:10.2.0.1. ...
- 【PHP分享】Windows tail工具分享
作者:zhanhailiang 日期:2014-09-28 在Linux下能够使用tail -f工具实时查看输出的日志.近期切换到本地Windows开发环境,顿时有点不爽.百度了下,最终找到tail的 ...