- 浏览: 692588 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (181)
- Matlab (16)
- Java (26)
- autoHotkey (4)
- openCV (1)
- C++ (50)
- PDF-XChange Viewer (2)
- 学术 (11)
- javascript (4)
- linux (11)
- SWT (9)
- latex (7)
- GAE (2)
- windows (6)
- C# (3)
- PS (20)
- JNI (4)
- latex,批处理 (0)
- 批处理 (4)
- Android (5)
- 矩阵论 (1)
- SVM (1)
- 概率图模型 (0)
- Python (12)
- Eigen (5)
- 编程题 (1)
- MKL (1)
- 神经网络 (9)
- 最优化 (2)
- 摄影 (1)
- PPT (0)
- After Effects (3)
- CUDA (3)
- caffe (0)
- MXNet (2)
- svn (1)
- R (0)
- 虚拟机 (0)
- tensorflow (7)
- theano (1)
- Keras (1)
- vim (1)
- xgboost (1)
- spark (6)
- eclipse (2)
- word2vec (0)
- hadoop (1)
- dmlc (1)
- git (0)
最新评论
-
jeffersonz:
请问大神,这个插件记录下来的脚本为什么不能再Extendscr ...
PhotoShop - 记录PS的所有操作为JavaScript代码 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道cherish ...
Eigen的编译选项;MKL的使用 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道 您好,您的工 ...
Eigen的编译选项;MKL的使用
初学,,感觉PS插件的文档很烂,,教程也很少,,也就这么简单学一下了!!!
adobe_photoshop_sdk下载:http://www.adobe.com/devnet/photoshop.html
本文实现的是最简单的filter插件--将图像取反---也就是根本没有任何参数的一个filter!!!
其实要有参数可以自己加对话框(不熟悉windows编程,没实现),,完全没必要采用adobe的框架。
感觉alien skin exposure ; google nik collection等都是自己实现的:先读一个要修改的图像,在自己插件里选好效果后执行,返回结果到PS。 因而学习adobe家的架构不是太必要
注:只保证对RGB图像有效,,,对灰度图本来可以,,后来不知道怎么回事,直接弹对话框说接口不支持。。。。
修改自 http://www.cnblogs.com/hoodlum1980/archive/2009/05/11/1453870.html 非常好的中文教程,,但是我改了他的没成功,,年份久了,接口变了,,,
以及 adobe_photoshop_sdk_cc_2014_win 中的 dissolve 例程
最后工程用的dissolve例程的,本文件是例程和该网页综合起来的,还有我自己写的
注意例程使用的是相对路径,,,所以本工程必须放到和例程dissolve的同一级目录才行!!!否则请按以上教程所示自行修改头文件及 编译pipl文件的程序路径
重要参考文献:
How to Write a Photoshop Plug-In, Part 1(强烈推荐!!) http://www.mactech.com/articles/mactech/Vol.15/15.04/PhotoshopPlug-InsPart1/index.html
Writing a Photoshop Plug-In, Part 2 http://www.mactech.com/articles/mactech/Vol.15/15.05/PhotoshopPlug-InsPart2/index.html
adobe_photoshop_sdk_cc_2014_win document (很烂,但毕竟比较全)
Photoshop 的插件及其实现:http://www.moon-soft.com/book/plugin.htm
最后贴上主要代码:工程文件见附件
adobe_photoshop_sdk下载:http://www.adobe.com/devnet/photoshop.html
本文实现的是最简单的filter插件--将图像取反---也就是根本没有任何参数的一个filter!!!
其实要有参数可以自己加对话框(不熟悉windows编程,没实现),,完全没必要采用adobe的框架。
感觉alien skin exposure ; google nik collection等都是自己实现的:先读一个要修改的图像,在自己插件里选好效果后执行,返回结果到PS。 因而学习adobe家的架构不是太必要
注:只保证对RGB图像有效,,,对灰度图本来可以,,后来不知道怎么回事,直接弹对话框说接口不支持。。。。
修改自 http://www.cnblogs.com/hoodlum1980/archive/2009/05/11/1453870.html 非常好的中文教程,,但是我改了他的没成功,,年份久了,接口变了,,,
以及 adobe_photoshop_sdk_cc_2014_win 中的 dissolve 例程
最后工程用的dissolve例程的,本文件是例程和该网页综合起来的,还有我自己写的
注意例程使用的是相对路径,,,所以本工程必须放到和例程dissolve的同一级目录才行!!!否则请按以上教程所示自行修改头文件及 编译pipl文件的程序路径
重要参考文献:
How to Write a Photoshop Plug-In, Part 1(强烈推荐!!) http://www.mactech.com/articles/mactech/Vol.15/15.04/PhotoshopPlug-InsPart1/index.html
Writing a Photoshop Plug-In, Part 2 http://www.mactech.com/articles/mactech/Vol.15/15.05/PhotoshopPlug-InsPart2/index.html
adobe_photoshop_sdk_cc_2014_win document (很烂,但毕竟比较全)
Photoshop 的插件及其实现:http://www.moon-soft.com/book/plugin.htm
最后贴上主要代码:工程文件见附件
// ADOBE SYSTEMS INCORPORATED // Copyright 1993 - 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this // file in accordance with the terms of the Adobe license agreement // accompanying it. If you have received this file from a source // other than Adobe, then your use, modification, or distribution // of it requires the prior written permission of Adobe. //------------------------------------------------------------------------------- #include "Matrix.hpp" #include "PiFilter.h" #include "FilterInfo.h" #include <stdio.h> /************************************************************************/ /* Photoshop 的无参数 filter 例程。 其实要有参数可以自己加对话框(不熟悉windows编程,没实现),,完全没必要采用adobe的框架。 感觉alien skin exposure ; google nik collection等都是自己实现的:先读一个要修改的图像,在自己插件里选好效果后执行,返回结果到PS。 因而学习adobe家的架构不是太必要 adobe_photoshop_sdk下载:[url]http://www.adobe.com/devnet/photoshop.html[/url] 修改自 http://www.cnblogs.com/hoodlum1980/archive/2009/05/11/1453870.html 非常好的中文教程,,但是我改了他的没成功,,年份久了,接口变了,,, 以及 adobe_photoshop_sdk_cc_2014_win 中的 dissolve 例程 最后工程用的dissolve例程的,本文件是例程和该网页综合起来的,还有我自己写的 注意例程使用的是相对路径,,,所以本工程必须放到和例程dissolve的同一级目录才行!!!否则请按以上教程所示自行修改头文件及 编译pipl文件的程序路径 重要参考文献: How to Write a Photoshop Plug-In, Part 1(强烈推荐!!) http://www.mactech.com/articles/mactech/Vol.15/15.04/PhotoshopPlug-InsPart1/index.html Writing a Photoshop Plug-In, Part 2 http://www.mactech.com/articles/mactech/Vol.15/15.05/PhotoshopPlug-InsPart2/index.html adobe_photoshop_sdk_cc_2014_win document (很烂,但毕竟比较全) Photoshop 的插件及其实现:http://www.moon-soft.com/book/plugin.htm */ /************************************************************************/ /************************************************************************/ /* 自己从新建立工程步骤(注意因为下面很多路径使用的是相对路径,,,所以本solution必须放到和例程dissolve的同一级目录(filter文件夹下)才行): 1、新建dll工程,, 拷贝本工程的一应文件 2、更改字符集为multibyte ; 更改输出文件类型为.8bf (debug、release要分别改,,下同) 3、拷贝dissolve工程的 c/c++ -> general -> additional include dictionaries 属性 4、拷贝dissolve工程的 linker -> input 属性 5、添加dissolve工程的common sources对应的cpp文件到本工程 6、右键LC_PSFilter.r,,设置编译属性,,这个直接copy就好 7、更改FilterInfo.h文件中的vendorName,,plugInName,,plugInUniqueID,,plugInDescription等属性 8、按下一个注释块更改本文件中的相关函数实现filter功能 */ /************************************************************************/ /************************************************************************/ /* 说明: 要实现自己的filter,,只需要修改processTile() 函数即可 (当前只是对RGB图像的实现)!!! 如果处理的通道不是RGB或灰度的,则也要修改setChannels()函数。 */ /************************************************************************/ /*******************************************/ //参数区 #ifndef NDEBUG #define USE_LOG //输出日志到桌面上 #endif #define USE_TILE__ //如果定义此项,,则将图片分成128*128的图像处理,如果不定义,则一次性进行处理 /*******************************************/ #ifdef USE_LOG //日志文件会出现在桌面上 #include "Logger.h" //template<typename Val> // void log (Logger& l, const char* des, Val v) { // l.Write (des, false); // l.Write (":\t", false); // l.Write (v, true); // } Logger logIt ("LCInvert"); #define printDesVal(des,v) logIt.Write (des, false);logIt.Write (":\t", false); logIt.Write (v, true); #define printDesValLn(v) printDesVal(#v,v); #define print(val) logIt.Write(val,false); #define println(val) logIt.Write(val,true); #else #define printDesVal(des,v) ; #define printDesValLn(v) ; #define print(val) ; #define println(val) ; #endif #ifdef _MANAGED #pragma managed(push, off) #endif #ifndef DLLExport #define DLLExport extern "C" __declspec(dllexport) #endif //======================================= // 全局变量 //======================================= //dll instance HINSTANCE dllInstance; FilterRecord* gFilterRecord; intptr_t* gData; int16* gResult; SPBasicSuite* sSPBasic = NULL; #define TILESIZE 128 //贴片大小:128 * 128 Rect m_Tile; //当前图像贴片(128*128) //======================================= // 函数列表 //======================================= //辅助函数,拷贝矩形 void CopyPsRect (Rect* src, Rect* dest); //辅助函数,把一个矩形置为空矩形 void ZeroPsRect (Rect* dest); void DoParameters(); void DoPrepare(); void DoStart(); void DoContinue(); void DoFinish(); //辅助函数,拷贝矩形 void CopyPsRect (Rect* src, Rect* dest) { dest->left = src->left; dest->top = src->top; dest->right = src->right; dest->bottom = src->bottom; } //辅助函数,把一个矩形置为空矩形 void ZeroPsRect (Rect* dest) { dest->left = 0; dest->top = 0; dest->right = 0; dest->bottom = 0; } #ifdef _MANAGED #pragma managed(pop) #endif //=================================================================================================== //------------------------------------ 滤镜被ps调用的函数 ------------------------------------------- //=================================================================================================== DLLExport MACPASCAL void PluginMain (const int16 selector, FilterRecordPtr filterRecord, intptr_t * data, int16 * result) { try { //Timer timeIt; //需要#include "Timer.h" print ("Selector: "); print (selector); print ("\t\t\t"); // update our global parameters gData = data; gResult = result; if (selector == filterSelectorAbout) { MessageBox (GetActiveWindow(), plugInDescription, plugInName, MB_OK); //sSPBasic = gFilterRecord->sSPBasic; } else { gFilterRecord = filterRecord; sSPBasic = gFilterRecord->sSPBasic; //虽然这是dissolve例程中的,,,但有下面两句,,直接不执行 continue了。。。。 //另外自己试的 int err = gFilterRecord->advanceState(); 方法也无法正常使用。。。(不报错,但是数据指针均为空)不知道注释了之后行不行,,没试 // if (gFilterRecord->bigDocumentData != NULL) // gFilterRecord->bigDocumentData->PluginUsing32BitCoordinates = true; } // do the command according to the selector switch (selector) { case filterSelectorAbout: println ("filterSelectorAbout"); //DoAbout(); break; case filterSelectorParameters: println ("filterSelectorParameters"); DoParameters(); break; case filterSelectorPrepare: println ("filterSelectorPrepare"); DoPrepare(); break; case filterSelectorStart: println ("filterSelectorStart"); DoStart(); break; case filterSelectorContinue: println ("filterSelectorContinue"); DoContinue(); break; case filterSelectorFinish: println ("filterSelectorFinish"); DoFinish(); break; default: break; } print ("Image size:"); print (filterRecord->imageSize.h); print ("*"); println (filterRecord->imageSize.v); printDesValLn (filterRecord->maxSpace); printDesValLn (filterRecord->planes); printDesValLn (filterRecord->depth); //printDesValLn( timeIt.GetElapsed()); println (""); } // end try catch (...) { if (NULL != result) *result = -1; } } //这里准备参数,就这个滤镜例子来说,我们暂时不需要做任何事 void DoParameters() { } //在此时告诉PS(宿主)滤镜需要的内存大小 void DoPrepare() { if (gFilterRecord != NULL) { gFilterRecord->bufferSpace = 0; gFilterRecord->maxSpace = 0; } } void setChannels() { //设置我们需要处理的通道 int nchanel = 3; switch (gFilterRecord->imageMode) { //我们这里只处理灰度图,或者RGB图像 case plugInModeRGBColor: nchanel = 3; case plugInModeGrayScale: nchanel = 1; default: nchanel = 3; break; } gFilterRecord->inLoPlane = 0; gFilterRecord->inHiPlane = nchanel - 1; gFilterRecord->outLoPlane = 0; gFilterRecord->outHiPlane = nchanel - 1; } //inRect : 滤镜请求PS发送的矩形区域。 //outRect : 滤镜通知PS接收的矩形区域。 //filterRect : PS通知滤镜需要处理的矩形区域。 //由于我们是使用固定的红色进行填充,实际上我们不需要请求PS发送数据 //所以这里可以把inRect设置为NULL,则PS不向滤镜传递数据。 void DoStart() { if (gFilterRecord == NULL) return; #ifdef USE_TILE__ //我们初始化第一个Tile,然后开始进行调用 m_Tile.left = gFilterRecord->filterRect.left; m_Tile.top = gFilterRecord->filterRect.top; m_Tile.right = min (m_Tile.left + TILESIZE, gFilterRecord->filterRect.right); //只要修改这里就变成分tile处理的了 m_Tile.bottom = min (m_Tile.top + TILESIZE, gFilterRecord->filterRect.bottom); #else //不分tile了,一次完成!!!! m_Tile.left = gFilterRecord->filterRect.left; m_Tile.top = gFilterRecord->filterRect.top; m_Tile.right = gFilterRecord->filterRect.right; m_Tile.bottom = gFilterRecord->filterRect.bottom; #endif //设置inRect, outRect //ZeroPsRect (&gFilterRecord->inRect); CopyPsRect (&m_Tile, &gFilterRecord->inRect); CopyPsRect (&m_Tile, &gFilterRecord->outRect); setChannels();//设置需要请求的通道 } template<typename T> void processTile() { //定位像素 int planes = gFilterRecord->outHiPlane - gFilterRecord->outLoPlane + 1; //通道数量 CopyPsRect (&gFilterRecord->outRect, &m_Tile); const int R = m_Tile.bottom - m_Tile.top; const int C = m_Tile.right - m_Tile.left; switch (planes) { case 1: {//单通道图像 T* pOut = (T*) gFilterRecord->outData; T* pIn = (T*) gFilterRecord->inData; LC::Matrix<T> in (pIn, R, C , gFilterRecord->inRowBytes); LC::Matrix<T> out (pOut, R, C, gFilterRecord->outRowBytes); printDesValLn ( (int) pIn[0]); for (int r = 0; r < R; r++) { //Sleep (100); // gFilterRecord->progressProc (r, out.rows() ); //显示进度条,此时按ESC键可以撤销该filter!!! // if (gFilterRecord->abortProc() ) {*gResult=-1; return}; for (int c = 0; c < C; c++) { T& orgb = out (r, c); T& irgb = in (r, c); orgb = LC::maxValInPS<T>() - irgb; } } } break; case 3: { //RGB图像 LC::RGB<T> *pOut = (LC::RGB<T>*) gFilterRecord->outData; LC::RGB<T>* pIn = (LC::RGB<T>*) gFilterRecord->inData; LC::Matrix<LC::RGB<T>> in (pIn, R, C, gFilterRecord->inRowBytes); LC::Matrix<LC::RGB<T>> out (pOut, R, C, gFilterRecord->outRowBytes); printDesValLn ( (int) pIn[0].r); //我们把输出矩形拷贝到 m_Tile for (int r = 0; r < R; r++) { //Sleep (100); // gFilterRecord->progressProc (r, out.rows() ); //显示进度条,此时按ESC键可以撤销该filter!!! // if (gFilterRecord->abortProc() ) {*gResult=-1; return}; for (int c = 0; c < C; c++) { LC::RGB<T>& orgb = out (r, c); LC::RGB<T>& irgb = in (r, c); orgb.r = LC::maxValInPS<T>() - irgb.r; orgb.g = LC::maxValInPS<T>() - irgb.g; orgb.b = LC::maxValInPS<T>() - irgb.b; } } } break; default: *gResult = -1; break; } } //这里对当前贴片进行处理,注意如果用户按了Esc,下一次调用将是Finish void DoContinue() { if (gFilterRecord == NULL) return; gResult = 0; println (gFilterRecord->depth); switch (gFilterRecord->depth) { case 8: processTile<uint8>(); break; case 16: processTile<uint16>(); break; case 32: processTile<uint32>(); break; default: *gResult = -1; break; } //判断是否已经处理完毕 if (gResult != 0 || ( m_Tile.right >= gFilterRecord->filterRect.right && m_Tile.bottom >= gFilterRecord->filterRect.bottom) ) { //处理结束 ZeroPsRect (&gFilterRecord->inRect); ZeroPsRect (&gFilterRecord->outRect); ZeroPsRect (&gFilterRecord->maskRect); return; } //设置下一个tile if (m_Tile.right < gFilterRecord->filterRect.right) { //向右移动一格 m_Tile.left = m_Tile.right; m_Tile.right = min (m_Tile.left + TILESIZE, gFilterRecord->filterRect.right); } else { //向下换行并回到行首处 m_Tile.left = gFilterRecord->filterRect.left; m_Tile.right = min (m_Tile.left + TILESIZE, gFilterRecord->filterRect.right); m_Tile.top = m_Tile.bottom; m_Tile.bottom = min (m_Tile.top + TILESIZE, gFilterRecord->filterRect.bottom); } // ZeroPsRect (&gFilterRecord->inRect); CopyPsRect (&m_Tile, &gFilterRecord->inRect); CopyPsRect (&m_Tile, &gFilterRecord->outRect); } //处理结束,这里我们暂时什么也不需要做 void DoFinish() { }
- LC_PSFilter_Template.7z (14.4 KB)
- 下载次数: 7
发表评论
-
C++函数中的静态变量
2019-07-19 11:22 821在C++中,可以在成员函数中使用静态变量,从而间接达到在hpp ... -
tensorflow 静态编译笔记 -- linux系统
2018-11-05 14:26 0注: 1、编译tensorflow静态库 很简单,参见: h ... -
gperftools笔记
2018-06-27 14:30 0export LD_LIBRARY_PATH=LD_LIBR ... -
dmlc分布式线性模型编译笔记
2018-06-06 10:37 21781、使用第三方修改后的wormhole工程 原始工程wor ... -
C++中读取控制台输出,并将文件指针FILE*转换为istream
2017-11-27 15:03 1845解决的问题: 1、通过执行系统的bash命令后,获取其输出( ... -
c++中使用boost库在共享内存中存储map
2017-11-09 11:37 5429boost库中的interprocess包可以在共享内存中创建 ... -
近似最近邻算法库FLANN
2017-04-25 18:45 0FLANN库是计算近似最近邻的库, 问题定义如下: 给定距离函 ... -
C++杂记-- 重定向std::cout等
2017-04-18 17:28 19731、屏蔽std::cout 参见:http://stackov ... -
CMake指定目标代码的平台(win32,x64)
2016-06-03 20:54 11730主要参考自:http://blog.c ... -
windows 10下安装GPU版MXNet
2016-06-03 21:28 8591上回说到编译CPU版的MXNet: http://cheris ... -
windows下安装CPU版mxnet
2016-05-23 23:14 17597MXnet (mix net)类似Caffe,Tensorfl ... -
照片处理流程-google nik collection 篇
2016-02-24 14:52 1112nik collection视频教程:https://www. ... -
Nik color efex pro 笔记
2016-02-21 20:47 1294nik collection在线教程、文档:https://s ... -
Linux C++编译及 静态/动态 链接库 笔记
2015-12-20 19:49 60571、C++文件的编译 g++参 ... -
Linux (Ubuntu) 下 Eclipse C++ 环境配置
2015-12-08 21:49 19601、安装JDK 参见http://blog.csdn.net/ ... -
PhotoShop - 柔光模式与强光模式 的 响应曲线对比
2015-11-10 17:11 1842从下图可以看出,当同源图层进行混合时,柔光模式和强光模式都加强 ... -
使Visual Assist X支持CUDA的.cu文件的代码提示
2015-07-17 00:05 2305现在安装CUDA很方便了,直接支持Visual Studio。 ... -
CUDA程序block和thread超出硬件允许值时的异常
2015-07-13 11:32 3755调用CUDA的核函数时指定block 和 thread大小,该 ... -
HDR图像PS教程集锦&心得
2015-06-23 09:34 924HDR是指高动态范围的图像,主要原理为提高图像的局部对比度。 ... -
matlab绘制色盘&色调混合模式
2015-06-13 19:25 27511、绘制色盘 代码统一放到最后。 结果如下 2、色调( ...
相关推荐
本篇将深入探讨如何进行Photoshop插件开发,特别是针对选区功能的实现。 在Photoshop插件开发中,你需要了解以下关键知识点: 1. **Adobe Photoshop SDK**:SDK(Software Development Kit)是Adobe提供的开发工具...
这样的插件通常由Adobe或其他第三方开发商提供,它们可以扩展Photoshop的功能,比如提升色彩管理、增加滤镜效果、优化色彩校正或提供特殊处理工具等。在本例中,"rgbformat.8bi"可能是一个Photoshop的滤镜插件文件,...
首先,Photoshop滤镜开发基于Adobe的Filter SDK(Software Development Kit),这个工具集提供了必要的库文件、头文件、示例代码和文档,帮助开发者创建自己的滤镜。滤镜通常以8bf(8BF Filter)格式存在,这种格式...
Photoshop,通常被称为PS,是Adobe公司开发的一款强大的图像处理软件。它以其丰富的功能和强大的编辑能力被广泛应用于平面设计、摄影后期制作以及各种创意视觉的创作中。"PS倒影滤镜"是Photoshop中的一种特效工具,...
在压缩包子文件的文件名称“tlsharpen.8bf”中,“tl”可能是Topaz Labs的缩写,而“.8bf”是Photoshop中的插件文件格式,全称为“8-Bit Filter File”。这种文件包含了滤镜的具体算法和数据,使得Photoshop能够识别...
Photoshop的"抽出滤镜"(Extract Filter)是Adobe Photoshop软件中一个强大的工具,用于从复杂背景中分离出前景对象。这个滤镜尤其适合处理有毛发、细丝或者透明边缘的对象,它提供了精细控制来确保提取过程的精确性...
本资源包含的“八大小滤镜合集”是一系列实用的插件,能够极大地扩展Photoshop的功能,提高工作效率,创造各种艺术效果。以下是这些滤镜的详细介绍: 1. **灯光工厂滤镜** (Light Factory): 这个滤镜提供了大量的...
"KPT7"提到的是一个特定的滤镜插件包,通常由第三方开发者提供,以扩展Photoshop内置滤镜的功能。 KPT7全称为Knoll's Photorealistic Texturing Toolkit 7,是由John Knoll(Adobe After Effects的共同创作者)开发...
Photoshop CS3是一款由Adobe公司开发的专业图像处理软件,它在设计、编辑和创意领域有着广泛的应用。ICO格式是用于创建网站图标的主要文件格式,它能够包含多种尺寸和颜色深度的图像,确保图标在不同设备和分辨率下...
Photoshop是一款全球知名的图像处理软件,由Adobe公司开发。它被广泛应用于图形设计、照片编辑、数字艺术创作等多个领域。然而,对于非英语为母语的用户来说,使用英文版Photoshop可能会面临理解和操作上的困难。这...
"滤镜水波倒影"是一款适用于Adobe Photoshop的专业滤镜插件,由Flaming Pear公司开发。这款滤镜能够为图像添加动态的水波效果,并创造出逼真的水面倒影,从而提升图像的艺术表现力和视觉吸引力。 该滤镜不仅兼容...
2. **Photoshop CC**:Adobe的另一款重量级产品,Photoshop具有更深度的修复功能,如克隆图章工具和内容感知填充,可用于修复照片中的破损部分。此外,它的滤镜库(Filter Gallery)包含多种艺术风格滤镜,可以将...
Photoshop等图像编辑工具提供的“Save for Web”功能便是这一用途。除此之外,有许多在线和离线工具也能够帮助进行图片的批量优化。优化后的图片不仅能够提升加载速度,同时减少带宽消耗。 2. 自定义favicon ...