批量翻转PNG图片
用了好几个软件都不好用.
要么不能翻转PNG, 要么翻转之后没有透明度了.
基本上全是图形界面, 要鼠标批量拖放.
所以, 还是自己动手, 写一个批量png翻转工具.
#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") enum { eHreverse, eVreverse }; 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 flipImage(const std::wstring &fileName, const CLSID &clsid, int type) { Gdiplus::Bitmap image(fileName.c_str()); if (image.GetLastStatus() == Gdiplus::Ok) { auto rotate = type == eHreverse ? Gdiplus::Rotate180FlipY : Gdiplus::Rotate180FlipX; image.RotateFlip(rotate); saveImage(&image, clsid, fileName); } } void run(const std::wstring &fileList, int type) { 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(flipImage, std::placeholders::_1, clsid, type)); } } 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"参数格式:\n" << L" imglist.txt type\n" << L" type:\n" << L" 0 水平翻转\n" << L" 1 垂直翻转" << std::endl; } else { run(argc[], parseTo<])); } std::wcout << L"run done." << std::endl; std::wcin.get(); ; }
使用说明:
一个包含被翻转图片路径列表的文本文件, 一个翻转类型(控制x, y轴翻转)
第一个参数可以参考我上一篇随笔: 批量缩放PNG图片.
批量翻转PNG图片的更多相关文章
- 批量下载网站图片的Python实用小工具
定位 本文适合于熟悉Python编程且对互联网高清图片饶有兴趣的筒鞋.读完本文后,将学会如何使用Python库批量并发地抓取网页和下载图片资源.只要懂得如何安装Python库以及运行Python程序, ...
- Zencart批量删除无图片产品
Zencart批量删除无图片产品 2012-04-23 07:26:18| 分类: 默认分类 |字号 订阅 转自 http://zhongjia33.blog.163.com/blog/#m=0 ...
- 批量下载网站图片的Python实用小工具(下)
引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...
- [转]解决Magento批量导入带图片的商品的问题
本文转自:http://www.phpstudio.info/show-121-791-1.html 一般来说,Magento后台管理里的CSV批量导入,可以解决我们商品批量上传的大部分问题,我们只要 ...
- python多线程批量下载远程图片
python多线程使用场景:多线程采集, 以及性能测试等 . 数据库驱动类-简单封装下 mysqlDriver.py #!/usr/bin/python3 #-*- coding: utf-8 -*- ...
- 自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)
using System; using System.Drawing; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; na ...
- 批量缩放PNG图片.
最近需要缩放N多图片, 找遍了互联网也没有找到方便使用的批量缩放工具.. 趁着周末写一个练手.. #include <iostream> #include <vector> # ...
- word2013怎样批量重设图片和大小?(转)
https://www.zhihu.com/question/52908434/answer/132934213 点击视图,宏,查看宏,任意输入一个宏名,创建,清空框内内容,复制以下代码粘贴,保存. ...
- Android之批量加载图片OOM问题解决方案
一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本 ...
随机推荐
- Android JNI 由C/C++本地代码向Java层传递数据
最近做的Android项目需要调用C代码,进行串口通信及与硬件设备通信,因此要用到JNI,其中本地代码需要向Java层返回三个参数,分别为 参数一:int型: 参数二: 通信指令,本地代码中为unsi ...
- HDU 4749 Parade Show 2013 ACM/ICPC Asia Regional Nanjing Online
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题目大意:给一个原序列N,再给出一个序列M,问从N中一共可以找出多少个长度为m的序列,序列中的数 ...
- Tornado源码探寻(请求到来)
上一篇中介绍了tornado框架在客户端请求之前所做的准备(下图1.2部分),本质上就是创建了一个socket服务端,并进行了IP和端口的绑定,但是未执行 socket的accept方法,也就是未获取 ...
- python-面向对象(一)——开篇基础
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 一.创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现, ...
- hdoj 1873 看病要排队【优先队列】
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- FLASH轮播广告 在谷歌浏览器中不显示的解决办法(FLash轮播放广告在谷歌浏览器中无法显示处理方法)
在用PHPWEB模板的时候,碰到首页有一个FLASH轮播广告,在IE浏览器下可以正常显示播放,在谷歌浏览器中却显示不了,解决办法如下: 欢迎转载:http://blog.csdn.net/aminfo ...
- mybatis update语句参数正常, 数据没有更新
昨天做的一个功能, 更新每天支付宝账号的所有订单收益 ,有一个update 语句:
- chrome 全屏无法退出
起因:chrome 按F11 全屏后,再按F11 死活无法退出全屏,关掉后,再打开chrome,自动全屏,F11无法退出全屏 系统:centos 6.3 解决:找到 chrome的用户数据存储目录,( ...
- richTextBox插入表格
附件:http://files.cnblogs.com/xe2011/richTextBox_InsertTable.rar 插入表格 /// <summary> /// 插入表格 /// ...
- LabVIEW中的UDP通信
UDP(user datagram protoco1)提供向接收端发送信息的最简便的协议,与TCP不同,UDP不是面向连接的可靠数据流传输协议,而是面向操作的不可靠数据流传输协议.UDP在数据传输之前 ...