关于分辨率

先扫一下盲:http://www.jianshu.com/p/c3387bcc4f6e。

我们所说的这个5.2英寸是手机屏幕对角线的长度。

分辨率1920px*1080px的意思就是,在这个华为荣耀7的5.2英寸屏幕上,在竖向的高度上有1920个像素块,在横向的宽度上有1080个像素块。

我们可以这么理解屏幕像素密度,即在一个对角线长度为1英寸的正方形内所拥有的像素数。

os

os.path.exists

python os.path模块常用方法详解

os.path.exists(path)

如果path存在,返回True;如果path不存在,返回False。

Python os.walk的用法与举例

链接

os.walk(top, topdown=True, onerror=None, followlinks=False)

可以得到一个三元tupple(dirpath, dirnames, filenames),

第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。

dirpath 是一个string,代表目录的路径,

dirnames 是一个list,包含了dirpath下所有子目录的名字。

filenames 是一个list,包含了非目录文件的名字。

这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name).

Linux中的绝对路径(Absolute Pathname)与相对路径(Relative Pathnames)

绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。

相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。


In [43]:
import os
import glob
from PIL import Image

def thumbnail_pic(path):
    a = glob.glob(r'*.jpg')
    for x in a:
        name = os.path.join(path, x)
        im = Image.open(name)
        im.thumbnail((1136, 640))
        print(im.format, im.size, im.mode)
        im.save(name, 'JPEG')
    print('Done!')

if __name__ == '__main__':
    path = '.'
    thumbnail_pic(path)


JPEG (100, 62) RGB
JPEG (100, 30) RGB
Done!

In [8]:
import glob

for filename in glob.glob('**/*.jpg', recursive=True):
    print(filename)


img_lights.jpg
anime/anime-girls.jpg
anime/Best-Cool-girls.jpg
anime/Cool-Anime.jpg
test_pic/image-slider2.jpg
test_pic/trolltunga.jpg

In [24]:
import os
import glob
from PIL import Image

def thumbnail_pic(path):
    for x in glob.glob('**/*.jpg', recursive=True):
        print ("x is \n ", x)
        name = os.path.join(path, x)
        print ("the join path is : \n", name)
        im = Image.open(name)
        print (im.format, im.size, im.mode)
        im.copy().thumbnail((1136, 640))
        print (im.format, im.size, im.mode)
        im.save("%s/output/%"/, 'JPEG')

    print('Done!')

if __name__ == '__main__':
    path = '.'
    thumbnail_pic(path)


x is 
  anime/anime-girls.jpg
the join path is : 
 ./anime/anime-girls.jpg
JPEG (853, 640) RGB
JPEG (853, 640) RGB
x is 
  anime/Best-Cool-girls.jpg
the join path is : 
 ./anime/Best-Cool-girls.jpg
JPEG (620, 349) RGB
JPEG (620, 349) RGB
x is 
  anime/Cool-Anime.jpg
the join path is : 
 ./anime/Cool-Anime.jpg
JPEG (620, 388) RGB
JPEG (620, 388) RGB
x is 
  test_pic/image-slider2.jpg
the join path is : 
 ./test_pic/image-slider2.jpg
JPEG (1000, 500) RGB
JPEG (1000, 500) RGB
x is 
  test_pic/img_lights.jpg
the join path is : 
 ./test_pic/img_lights.jpg
JPEG (600, 400) RGB
JPEG (600, 400) RGB
x is 
  test_pic/trolltunga.jpg
the join path is : 
 ./test_pic/trolltunga.jpg
JPEG (1000, 300) RGB
JPEG (1000, 300) RGB
Done!

两种情况

把resize的image保存到和原image同一目录下

http://pillow.readthedocs.io/en/3.1.x/reference/Image.html#create-thumbnails 这个直接通过thumbnail()这个方法来做到resize。

在python3.5中,glob.glob通过**来递归得寻找所有符合.jpg的文件,比起2.7来说确实方便很多。

另外为了保存到和原image同一目录下,我们要os.path.splitext(path) 分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作. 下面的file,ext里,file用来当做绝对路径,最后用im.save( file + ".thum.jpg")。其中.thum.jpg只是为了方便我们知道哪些文件是重新制作的,也可以直接用'.jpg'


In [42]:
from PIL import Image
import glob, os

size = 100, 100

for infile in glob.glob("**/*.jpg"):
    file, ext = os.path.splitext(infile)
    print (file)
    print (ext)
    im = Image.open(infile)
    im.thumbnail(size)
    im.save( file + ".thum.jpg")
    #print (im.format, im.size, im.mode)


anime/anime-girls
.jpg
anime/anime-girls.thum
.jpg
anime/Best-Cool-girls
.jpg
anime/Best-Cool-girls.thum
.jpg
anime/Cool-Anime
.jpg
anime/Cool-Anime.thum
.jpg
output/anime-girls
.jpg
output/anime-girls.thum
.jpg
output/Best-Cool-girls
.jpg
output/Best-Cool-girls.thum
.jpg
output/Cool-Anime
.jpg
output/Cool-Anime.thum
.jpg
output/image-slider2
.jpg
output/image-slider2.thum
.jpg
output/img_lights
.jpg
output/img_lights.thum
.jpg
output/trolltunga
.jpg
output/trolltunga.thum
.jpg
test_pic/image-slider2
.jpg
test_pic/image-slider2.thum
.jpg
test_pic/img_lights
.jpg
test_pic/img_lights.thum
.jpg
test_pic/trolltunga
.jpg
test_pic/trolltunga.thum
.jpg

把resize的image保存到同一目录下

另外为了保存到和原image同一目录下,我们要 os.path.split(path)

将path分割成目录和文件名二元组返回。

>>> os.path.split('c:\\csv\\test.csv') 
('c:\\csv', 'test.csv')

下面的file,ext里,file用来当做绝对路径,最后用im.save( "./output/" + ext)。其中"./output/"使我们指定的文件目录,最后ext是image原始的文件名


In [41]:
from PIL import Image
import glob, os

size = 100, 100

for infile in glob.glob("**/*.jpg"):
    file, ext = os.path.split(infile)
    print (file)
    print (ext)
    im = Image.open(infile)
    im.thumbnail(size)
    im.save( "./output/" + ext)
    #print (im.format, im.size, im.mode)


anime
anime-girls.jpg
anime
anime-girls.thum.jpg
anime
Best-Cool-girls.jpg
anime
Best-Cool-girls.thum.jpg
anime
Cool-Anime.jpg
anime
Cool-Anime.thum.jpg
test_pic
image-slider2.jpg
test_pic
image-slider2.thum.jpg
test_pic
img_lights.jpg
test_pic
img_lights.thum.jpg
test_pic
trolltunga.jpg
test_pic
trolltunga.thum.jpg

运行error

# -*- coding:utf-8 -*-
# *第 0005 题:**你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小。

from PIL import Image
import glob, os

size = 100, 100

def thumbnail_rel(path):
    for infile in glob.glob("**/*.jpg"):
        file, ext = os.path.splitext(infile)
        # print (file)
        # print (ext)
        img = Image.open(infile)
        img.thumbnail(size)
        img.save( file + ".thum.jpg")
        #print (im.format, im.size, im.mode)
    print ('Done!')

def thumbnail_abs(path):
    for infile in glob.glob("**/*.jpg"):
        file, ext = os.path.split(infile)
        # print (file)
        # print (ext)
        img = Image.open(infile)
        img.thumbnail(size)
        img.save( path + '/output/' + ext)
        #print (im.format, im.size, im.mode)
    print ('Done!')


if __name__ == '__main__':
    path = '.'
    thumbnail_rel(path)
    thumbnail_abs(path)

在直接用python play5.py的时候,出错了。

忘了切换成python3.5的环境。

另外我写上了path,另外img.save( path + file + ".thum.jpg"). 出错了,把path去掉就好了,img.save( file + ".thum.jpg")

因为我在path部分写的是'.', 对于thumbnail_rel, 保存的位置就是'.anime/XXX,但是并没有.anime这个文件夹,去掉path后直接是anime就可以了。如果anime前面多一个/也可以。

而对于thumbnail_abs, ./output/XXXX是能识别的,所以没有报错


In [ ]: