内容简介:这篇要解决一个问题:重新采样 的各个配置,有什么不同如何?1.重新设置图片尺寸:想了一下用node还是python呢? 还是python吧,分析起来方便些
activeDocument对象在全局对象app中,但可以直接使用,就像浏览器中document之于window 复制代码
一、批量图片尺寸重设
这篇要解决一个问题:重新采样 的各个配置,有什么不同如何?
1.重新设置图片尺寸: resizeImage
/** * 重新设置图片大小 * @param width 宽度 number * @param height 高度 number * @param resolution 分辨率 number * @param resampleMethod 重新采样模式 {@link ResampleMethod} * @param amount 减少杂色 number 0 - 100 */ resizeImage: function (width, height, resolution, resampleMethod, amount) { }, ResampleMethod = { //重新采样模式 AUTOMATIC: "自动", BICUBIC: "两次立方", BICUBICAUTOMATIC: "两次立方自动", BICUBICSHARPER: "两次立方(较锐利)(缩减)", BICUBICSMOOTHER: "两次立方(较平滑)(扩大)", BILINEAR: "两次线性", NEARESTNEIGHBOR: "邻近(硬边缘)", PRESERVEDETAILS: "保留细节(扩大)", NONE: "无" }; 复制代码
2.封装一个简单的方法
obj = { path: "K:\\图片素材\\head\\",//文件夹 name: "wy.jpg", config: { width: 200, height: 200, dpi: 72, ResampleMethod: ResampleMethod.BICUBIC, } }; resizeFile(obj,"res-"); /** * 重新修改一个图片的尺寸 * @param obj 对象 * @param fix 前缀 */ function resizeFile(obj, fix) { var img = File(obj.path + obj.name); var outName = obj.path + fix + obj.name;//输出名 open(img); var config = obj.config; if (config.ResampleMethod === ResampleMethod.NONE) { activeDocument.resizeImage(config.width, config.height); } else { activeDocument.resizeImage(config.width, config.height, config.dpi, config.ResampleMethod); } activeDocument.saveAs(File(outName), JPEGSaveOptions, true, Extension.LOWERCASE); activeDocument.close(SaveOptions.DONOTSAVECHANGES) } 复制代码
3.省力的for循环
models = [ResampleMethod.BICUBIC,//重新采样模式 ResampleMethod.AUTOMATIC, ResampleMethod.BICUBIC, ResampleMethod.BICUBICAUTOMATIC, ResampleMethod.BICUBICSMOOTHER, ResampleMethod.BICUBICSHARPER, ResampleMethod.BILINEAR, ResampleMethod.NEARESTNEIGHBOR, ResampleMethod.PRESERVEDETAILS, ResampleMethod.NONE ]; for (var i = 0; i < models.length; i++) { obj.config.ResampleMethod = models[i]; var fix = obj.config.ResampleMethod.toString().split(".")[1] + "-"; resizeFile(obj, fix); } 复制代码
二、数据分析
想了一下用node还是 python 呢? 还是python吧,分析起来方便些
1.采样模式的选择对输出大小的影响
为了方便说明,这里用matplotlib把数据输出一下
import os import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties class Datas: def __init__(self, names=[], sizes=[], ratio=1.0): self.names = names self.sizes = sizes self.ratio = ratio def path2name(path): return os.path.basename(path).split("-")[0] def get_data(path): datas = Datas() paths = scan(path) datas.names = map(path2name, paths) datas.ratio = 4 / 9 for path in paths: size = os.stat(path).st_size size_kb = size / 1024 datas.sizes.append(size_kb) return datas # 获取文件夹中的文件 def scan(dir): res = [] if os.path.exists(dir): lists = os.listdir(dir) for i in range(0, len(lists)): sonPath = os.path.join(dir, lists[i]) res.append(sonPath) if os.path.isdir(sonPath): scan(sonPath) return res def draw_bar(labels, quants): font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=14) width = 0.5 ind = np.linspace(0, 9, 10) # 0.5~9.5 10个样本 fig = plt.figure(1, figsize=(15, 5)) # 编号, 宽和高,分辨率, 背景颜色, 边框颜色, 是否显示边框 ax = fig.add_subplot(111) # 一行一列取一块 ax.bar(ind, quants, width, color='green') ax.set_xticks(ind) ax.set_xticklabels(labels, ) ax.set_ylabel('图片大小/kB', fontproperties=font) # y标签 ax.set_title('采样模式', bbox={'facecolor': '0.8', 'pad': 5}, fontproperties=font) # 标题 plt.grid(True) plt.show() plt.savefig("bar.jpg") plt.close() if __name__ == '__main__': datas = get_data(r"K:\图片素材\head") draw_bar(datas.names, datas.sizes) 复制代码
2.结果分析
做了三组数据: NEARESTNEIGHBOR 邻近(硬边缘) 的尺寸比较大 BICUBICSMOOTHER 两次立方(较平滑)(扩大) 的尺寸比较小 复制代码
当然一张图片的数据并不可靠,下面又做了几组
总的来看,大小差异也不是很大,NEARESTNEIGHBOR 似乎都是最大的
3.看一下各自的效果
感觉可以写个拼图的脚本,把一个文件夹的图都拼在一起,将名字写在下面
作为文件夹预览图感觉挺不错...
三、图片尺寸重设
也许对设计师而言,改个尺寸就是点两下的事,就像呼吸一样简单自然。 那图片尺寸重设的根源是什么?
一张100px*100px的ARGB_8888图片来说:是由10000个像素组成的,一个像素记录argb四种颜色信息 所以图片 = 颜色信息的排列组合 , 显示器可以读取这些信息,然后呈现在人的面前 图片尺寸往深了说就是:在削减信息的同时保持色彩分布的一致,这听起来好像很厉害的样子 人体由很多细胞构成,细胞中记录着很多信息,甩掉某些细胞然后变小,还能和原来长得一样,正常生存 是不是想想就很奇妙。图片和人类的区别在于,ps里有一句api... 但图片尺寸缩小意味着像素信息的丢失,无论如何,它已不再是曾经的它 关键就在于像素该怎么丢,于是几种模式就应运而生: 复制代码
1. NEARESTNEIGHBOR: "邻近(硬边缘)"
方式: 将相邻的像素复制到新的位置,以改变像素总值。 优点: 速度快 缺点: 不够精确,影像边缘粗糙不平滑,容易出现马赛克。 适用: 细节较少,处理简单、纯色的图像 复制代码
2. BILINEAR: "两次线性"
方式: 以2x2=4个像素为基础进行计算,替代原像素以改变像素总值。 优点: 质量要较邻近法好,计算速度却接近邻近法 缺点: 不够精确 适用: 细节较少,处理简单、纯色的图像 复制代码
3. BICUBIC: "两次立方"
方式: 以4x4个像素即16个像素的面积来计算一个新的像素,替代原像素以改变像素总值。 优点: 结果要更为精确,比较自然、平滑 缺点: 计算速度相对较慢 适用: 人物照等 复制代码
4. BICUBICSMOOTHER: "两次立方(较平滑)(扩大)"
方式: 以两次立方法基础为基础,取样时会更注意影像色彩的渐变部分。 优点: 结果要更为精确,渐变更自然、平滑 缺点: 计算速度相对较慢 适用: 广告摄影,风景,夕阳等渐变丰富、讲究层次的影像中 复制代码
5. BICUBICSHARPER: "两次立方(较锐利)(缩减)"
方式: 以两次立方法基础为基础,取样时会更注意影像的锐利度。 优点: 结果要更为精确,渐变更自然、平滑 缺点: 计算速度相对较慢 适用: 缩小 复制代码
6. PRESERVEDETAILS: "保留细节(扩大)"
方式: 主要是减少图片的杂色。 优点: 图片更加细腻 缺点: 计算速度相对较慢 适用: 精细的图片 复制代码
其他几个自动就不废话了
四、分别率
1. dip和ppi
记得以前写过一篇屏幕相关的文章,这里再说一遍,毕竟还挺重要
ppi(Pixel Per Inch), 即每英寸的像素。 dpi(Dot Per Inch), 即每英寸的点数。 复制代码
每英寸的像素数能难倒你吗? OPPO-R15X 的 ppi : 2577px/6.4in = 402.65625 px/in 约402.6ppi OPPO-A77 的 ppi : 2202px/5.5in = 400.363... px/in 约400.4ppi OPPO-R801 的 ppi : 576px/3.5in = 164.571... px/in 约164.6ppi 复制代码
ppi形象一点的比喻:
一个一元硬币直径约1 in,现在让一元硬币(包括背景)等大显示在三个手机上:
OPPO-R15X需要用:`402*402=161604 个像素点` OPPO-A77需要用:`400*400=160000 个像素点` OPPO-R15X需要用:`164*164=26896 个像素点` 我们知道像素组成了显示的图片,也就是说用161604个点和26896个点组成相同的画面 那么26896的那个看起来效果自然要比161604的差很多,161604更加紧密,所以视觉感好 复制代码
来分析一下笔记本电脑:
笔记本电脑 的 ppi : 21567 / 14=111.928.. px/in 约112ppi 也就是 1 in 里有112个像素点,`1 in = 25.4mm` 人眼可视长度是0.1mm,所以你近些看可以看到颗粒 普通的web图片只要求72dpi就够了,因为只是显示在屏幕上而言 复制代码
打印精度: dpi
dpi又是什么鬼,点数又是什么鬼?---dpi称为打印精度 打印机将[彩色液体油墨]经喷嘴变成细小微粒喷到印纸上,一个颗粒代表1点 dpi的意思是每英寸墨滴点数,比如300dpi的意思就是每英寸墨滴的个数为300 300dpi 和 72dpi 的区别: 用300个点表示一个硬币的视觉信息,和72个点表示一个硬币的视觉信息 可想而知300的更加精细,在纸上至少要300dpi才能满足视觉要求,所以 大学时做要打印的ps产品效果图都要把图片的dpi调到300以上,因为需要打印 复制代码
现在应该拨开云雾见青天了,只在浏览器中dpi没有用,px为王 在打印的时候dpi会发挥作用: 同px的图片dpi越大,图片越小!图片越小!图片越小!
因为这样更精细,Over,就这样。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- MySQL5.7.24 忘记root密码重设方法
- 脚本文件里的 Hybrid Script(混合式脚本)
- 脚本错误量极致优化-定位压缩且无 SourceMap 文件的脚本错误
- 如何从PHP脚本(如批处理文件)中运行多个PHP脚本?
- 荐 python脚本如何监听终止进程行为,如何通过脚本名获取pid
- 在新的,干净的PowerShell实例中调用PowerShell脚本(在另一个脚本中)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。