批量翻转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的问题.那么如何彻底解决这个问题呢?本 ...
随机推荐
- bat处理打开关门exe
@echo off rem rem 注释 tastkill /f /im a.exe cd %CD% %CD:~0,1%: cd %Cd%b start %CD%a.exe cd .. %CD:~0 ...
- Unity优化之纹理集
发现了一个比较好用的插件:ProDrawCallOptimizer. 它是用来合并纹理和材质的,而且用起来非常简便. 操作方法: 1.将包拖入Unity5中:ps:由于版本问题,直接双击包时导入不了 ...
- 批量导入图片到word并添加文件名
Sub InsertPic() Dim myfile As FileDialog Set myfile = Application.FileDialog(msoFileDialogFilePicker ...
- 为什么用 Java:一个 Python 程序员告诉你
这篇文章专门给程序员写的,普通读者慎入.原作者:Kevin Sookocheff 译者:Celia Zhen,原文点击文末链接. 每当我告诉别人我一直在用Java工作时,大家的反应都是: “纳尼!Ja ...
- mysql数据库引擎问题汇总
可以使用mysql> show engines;查看mysql支持何种引擎, 其中default表明该引擎为默认引擎. 在windows下面的mysql引擎默认为InnoDB,linux下的为 ...
- Preferred Java way to ping a HTTP Url for availability
I need a monitor class that regularly checks whether a given HTTP URL is available. I can take care ...
- poj 3468 A Simple Problem with Integers【线段树区间修改】
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 79137 ...
- 【python自动化第三篇:python入门进阶】
鸡汤: 多学习,多看书. 推荐书籍:<追风筝的人>,<林达看美国>,<白鹿原> 本节知识点 集合及其操作 文件操作 函数与函数式编程 递归 一.集合及其操作 集合( ...
- Eclipse用法和技巧十二:快速复制一行
写代码的总有那么个时候需要Ctrl+c,Ctrl+v,在eclipse中如果遇到需要快速在一行代码的上下复制一行的话,有很方便的快捷键可以使用.将光标放到某一行,按住Ctrl+Alt+Down,即可以 ...
- https_request请求接口返回数据
定义一个https_request方法 <?php function https_request($url, $data = null) { $curl = curl_init(); curl_ ...