批量翻转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的问题.那么如何彻底解决这个问题呢?本 ...
随机推荐
- SLua 中使用 Lua 5.3 的编译工程
2016-03-05 更新: 之前编译的库,在 Android 下 Lua_Number 和 Lua_Integer 被编译为了32位,导致从 C# 到 Lua 过程中有64位到32位整型转换会出现溢 ...
- 好用的ajax后台框架
dwz 简单实用的国产jquery Ui框架 http://www.j-ui.com/#_blank
- Bzoj 1046: [HAOI2007]上升序列 二分,递推
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3671 Solved: 1255[Submit][Stat ...
- Java web.xml加载顺序
web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener&g ...
- 一段网上java常见escape和unescape方法的BUG
escape编码和unescape编码,就是将一个字符转换为16进制unicode编码,前面加%字符进行标识. 此处不再多做解释,参考这里:http://www.jb51.net/article/23 ...
- 【转】shell 教程——05 第一个Shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了. 输入一些代码: #!/bin/bash ...
- 转:栈和队列小知识【STL用法】
原文出处:http://blog.csdn.net/chenzhenyu123456/article/details/44519943 栈: (一)头文件 #include<stack> ...
- [学习笔记]设计模式之Factory Method
写在前面 为方便读者,本文已添加至索引: 设计模式 魔法手札索引 在上篇笔记Abstract Factory设计模式中,时の魔导士创建了一系列的FoodFactory,并教会了其中一名霍比特人theC ...
- Android中应用程序如何获得系统签名权限
有些库的使用条件比较苛刻,要求同一签名的程序才可以获得访问权.此时即便是在AndroidManifest.xml中添加了相应的permission,依旧会得到没有xx访问权限的问题.比如android ...
- Linux发送监控指标到内部邮箱
数据库的健康监控是个很重要的工作.重要的指标\KPI监控结果会有专门的採集.监控.告警系统来做相关事情. 而一些不是很重要的或者还在设计和调试阶段的相关指标,我仅仅是想发送到我自己邮箱,本文就针对在s ...