批量翻转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的问题.那么如何彻底解决这个问题呢?本 ...
随机推荐
- Java异常错误的面试题及答案
1) Java中什么是Exception? 这个问题经常在第一次问有关异常的时候或者是面试菜鸟的时候问.我从来没见过面高级或者资深工程师的 时候有人问这玩意,但是对于菜鸟,是很愿意问这个的.简单来说, ...
- Tyvj P1463 智商问题 分块
P1463 智商问题 时间: 1500ms / 空间: 131072KiB / Java类名: Main 背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他 ...
- Android webView 正确的用法
Android webView 正确的用法 引言: 我在网络找了几个例子,基本上都有问题,<Android疯狂讲义>13.4中的源代码也有问题.终于在官网找到正确的用法.点我. 基本用法: ...
- 支持Python 2.7的pylot
想用pylot测试一下板子上面的嵌入式web server.结果报错. E:\pylot_1.26>run.py -a 2 Traceback (most recent call last): ...
- The File's Owner
The File Owner is an instantiated, runtime object that owns the contents of your nib and its outlets ...
- http协议和web本质
转载:http://www.cnblogs.com/dinglang/archive/2012/02/11/2346430.html http协议和web本质 当你在浏览器地址栏敲入“http://w ...
- 解决@media screen (自适应)IE浏览器不兼容问题
1.解决兼容性问题 (1)页面最顶部必须定义:<!DOCTYPE html> (2)点击:下载 respond.js 文件 (3)引入<script src="respon ...
- Anniversary Party
Time limit: 0.5 second Memory limit: 8 MB Background The president of the Ural State University is g ...
- getline和get的区别
#include<iostream> #include<fstream> #include<cstring> using namespace std; int ma ...
- ARCGIS获取图层下的要素信息及要素类转换为要素
/// <summary> /// 得到需要的字段名和字段值 /// </summary> /// <param name="layer">&l ...