PS脚本篇--2.图片尺寸重设,你了解多少?

栏目: Python · 发布时间: 6年前

内容简介:这篇要解决一个问题:重新采样 的各个配置,有什么不同如何?1.重新设置图片尺寸:想了一下用node还是python呢? 还是python吧,分析起来方便些
activeDocument对象在全局对象app中,但可以直接使用,就像浏览器中document之于window
复制代码

一、批量图片尺寸重设

这篇要解决一个问题:重新采样 的各个配置,有什么不同如何?

1.重新设置图片尺寸: resizeImage

PS脚本篇--2.图片尺寸重设,你了解多少?
/**
 * 重新设置图片大小
 * @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循环

PS脚本篇--2.图片尺寸重设,你了解多少?
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.结果分析

PS脚本篇--2.图片尺寸重设,你了解多少?
PS脚本篇--2.图片尺寸重设,你了解多少?
PS脚本篇--2.图片尺寸重设,你了解多少?
做了三组数据: 
NEARESTNEIGHBOR 邻近(硬边缘)              的尺寸比较大
BICUBICSMOOTHER 两次立方(较平滑)(扩大)   的尺寸比较小
复制代码

当然一张图片的数据并不可靠,下面又做了几组

PS脚本篇--2.图片尺寸重设,你了解多少?
PS脚本篇--2.图片尺寸重设,你了解多少?
PS脚本篇--2.图片尺寸重设,你了解多少?

总的来看,大小差异也不是很大,NEARESTNEIGHBOR 似乎都是最大的

3.看一下各自的效果

感觉可以写个拼图的脚本,把一个文件夹的图都拼在一起,将名字写在下面

作为文件夹预览图感觉挺不错...

PS脚本篇--2.图片尺寸重设,你了解多少?
PS脚本篇--2.图片尺寸重设,你了解多少?

三、图片尺寸重设

也许对设计师而言,改个尺寸就是点两下的事,就像呼吸一样简单自然。 那图片尺寸重设的根源是什么?

一张100px*100px的ARGB_8888图片来说:是由10000个像素组成的,一个像素记录argb四种颜色信息
所以图片 = 颜色信息的排列组合 , 显示器可以读取这些信息,然后呈现在人的面前
图片尺寸往深了说就是:在削减信息的同时保持色彩分布的一致,这听起来好像很厉害的样子  

人体由很多细胞构成,细胞中记录着很多信息,甩掉某些细胞然后变小,还能和原来长得一样,正常生存  
是不是想想就很奇妙。图片和人类的区别在于,ps里有一句api...

但图片尺寸缩小意味着像素信息的丢失,无论如何,它已不再是曾经的它
关键就在于像素该怎么丢,于是几种模式就应运而生:
复制代码

1. NEARESTNEIGHBOR: "邻近(硬边缘)"

PS脚本篇--2.图片尺寸重设,你了解多少?
方式: 将相邻的像素复制到新的位置,以改变像素总值。
优点: 速度快
缺点: 不够精确,影像边缘粗糙不平滑,容易出现马赛克。
适用: 细节较少,处理简单、纯色的图像
复制代码

2. BILINEAR: "两次线性"

PS脚本篇--2.图片尺寸重设,你了解多少?
方式: 以2x2=4个像素为基础进行计算,替代原像素以改变像素总值。
优点: 质量要较邻近法好,计算速度却接近邻近法
缺点: 不够精确
适用: 细节较少,处理简单、纯色的图像
复制代码

3. BICUBIC: "两次立方"

PS脚本篇--2.图片尺寸重设,你了解多少?
方式: 以4x4个像素即16个像素的面积来计算一个新的像素,替代原像素以改变像素总值。
优点: 结果要更为精确,比较自然、平滑
缺点: 计算速度相对较慢
适用: 人物照等
复制代码

4. BICUBICSMOOTHER: "两次立方(较平滑)(扩大)"

PS脚本篇--2.图片尺寸重设,你了解多少?
方式: 以两次立方法基础为基础,取样时会更注意影像色彩的渐变部分。
优点: 结果要更为精确,渐变更自然、平滑
缺点: 计算速度相对较慢
适用: 广告摄影,风景,夕阳等渐变丰富、讲究层次的影像中
复制代码

5. BICUBICSHARPER: "两次立方(较锐利)(缩减)"

PS脚本篇--2.图片尺寸重设,你了解多少?
方式: 以两次立方法基础为基础,取样时会更注意影像的锐利度。
优点: 结果要更为精确,渐变更自然、平滑
缺点: 计算速度相对较慢
适用: 缩小
复制代码

6. PRESERVEDETAILS: "保留细节(扩大)"

PS脚本篇--2.图片尺寸重设,你了解多少?
方式: 主要是减少图片的杂色。
优点: 图片更加细腻
缺点: 计算速度相对较慢
适用: 精细的图片
复制代码

其他几个自动就不废话了

四、分别率

1. dip和ppi

记得以前写过一篇屏幕相关的文章,这里再说一遍,毕竟还挺重要

PS脚本篇--2.图片尺寸重设,你了解多少?
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更加紧密,所以视觉感好
复制代码
PS脚本篇--2.图片尺寸重设,你了解多少?

来分析一下笔记本电脑:

PS脚本篇--2.图片尺寸重设,你了解多少?
笔记本电脑 的 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以上,因为需要打印

复制代码
PS脚本篇--2.图片尺寸重设,你了解多少?

现在应该拨开云雾见青天了,只在浏览器中dpi没有用,px为王 在打印的时候dpi会发挥作用: 同px的图片dpi越大,图片越小!图片越小!图片越小!

因为这样更精细,Over,就这样。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Django

Pro Django

Marty Alchin / Apress / 2008-11-24 / USD 49.99

Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试