批量翻转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的问题.那么如何彻底解决这个问题呢?本 ...
随机推荐
- ajax_demo:GET POST发送数据
GET,通过url发送数据 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- NOI2007 货币兑换
[问题描述] 小 Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的顾客都有一个自己的 帐户.金券的数目可以是一个实数.每天 ...
- Eclipse编译ijkplayer
参考链接:http://blog.csdn.net/fatiao101/article/details/49586379
- PL/SQL练习
简单结构 set serveroutput on; DECLARE v_name ); BEGIN v_name := 'hello'; dbms_output.put_line(v_name); E ...
- mongDB基本命令和Java操作MongoDB
上一篇博文<mongoDB安装>我们安装了mongoDB,现在来复习一下它的一些基本命令:mongoDB的bin目录加入到path之后,命令行中输入mongo: 然后我们进入正题 1.查看 ...
- 337. House Robber III
二刷吧..不知道为什么house robbery系列我找不到笔记,不过印象中做了好几次了. 不是很难,用的post-order做bottom-up的运算. 对于一个Node来说,有2种情况,一种是选( ...
- Intent是什么?
一.理解Intent: 在一个Android应用中,主要是由四种组件组成的,这四种组件可参考“Android应用的构成”.而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的And ...
- 食品药检所LIMS需求分析说明书
1.XX市食品药检所LIMS系统需求分析... 5 1.1检验业务流程... 5 1.1.1样品受理... 5 1.1.1.1选择受理任务... 5 1.1.1.2录入检品信息... 5 1.1.1. ...
- BABOK - 企业分析(Enterprise Analysis)
BABOK - 企业分析(Enterprise Analysis)概要 发表于2013年10月9日由周金根 描述 企业分析描述我们如何捕捉.提炼并明晰业务需要,并定义一个可能实现这些业务需要的一个方案 ...
- MVC Controller return 格式
所看到的Action都是return View();我们可以看作这个返回值用于解析一个aspx文件.而它的返回类型是ActionResult如 public ActionResult Index() ...