Hướng dẫn scale image python - con trăn hình ảnh quy mô

Đã hỏi 13 năm, 11 tháng trước 13 years, 11 months ago

Đã xem 1,0m lần 1.0m times

Có một cách rõ ràng để làm điều này mà tôi đang thiếu? Tôi chỉ đang cố gắng làm hình thu nhỏ.

Ali Afshar

40.1K12 Huy hiệu vàng90 Huy hiệu bạc109 Huy hiệu đồng12 gold badges90 silver badges109 bronze badges

Đã hỏi ngày 7 tháng 11 năm 2008 lúc 23:08Nov 7, 2008 at 23:08

Thứ Bảy thứ bảysaturdayplace

8.0608 Huy hiệu vàng34 Huy hiệu bạc39 Huy hiệu đồng8 gold badges34 silver badges39 bronze badges

3

Xác định kích thước tối đa. Sau đó, tính toán tỷ lệ thay đổi kích thước bằng cách lấy

im.thumbnail(size,Image.ANTIALIAS)
4.

Kích thước thích hợp là

im.thumbnail(size,Image.ANTIALIAS)
5.

Tất nhiên cũng có một phương thức thư viện để thực hiện điều này: phương thức

im.thumbnail(size,Image.ANTIALIAS)
6. Dưới đây là một ví dụ (chỉnh sửa) từ tài liệu PIL.
Below is an (edited) example from the PIL documentation.

import os, sys
import Image

size = 128, 128

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im = Image.open(infile)
            im.thumbnail(size, Image.ANTIALIAS)
            im.save(outfile, "JPEG")
        except IOError:
            print "cannot create thumbnail for '%s'" % infile

Hướng dẫn scale image python - con trăn hình ảnh quy mô

Oberbaum

2.4547 Huy hiệu vàng36 Huy hiệu bạc52 Huy hiệu Đồng7 gold badges36 silver badges52 bronze badges

Đã trả lời ngày 7 tháng 11 năm 2008 lúc 23:15Nov 7, 2008 at 23:15

12

Kịch bản này sẽ thay đổi kích thước một hình ảnh (somePic.jpg) bằng PIL (Thư viện hình ảnh Python) theo chiều rộng 300 pixel và chiều cao tỷ lệ thuận với chiều rộng mới. Nó thực hiện điều này bằng cách xác định bao nhiêu phần trăm 300 pixel có chiều rộng ban đầu (img.size [0]) và sau đó nhân chiều cao ban đầu (img.size [1]) với tỷ lệ phần trăm đó. Thay đổi "BaseWidth" thành bất kỳ số nào khác để thay đổi độ rộng mặc định của hình ảnh của bạn.

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')

rubo77

18.4K28 Huy hiệu vàng127 Huy hiệu bạc218 Huy hiệu đồng28 gold badges127 silver badges218 bronze badges

Đã trả lời ngày 16 tháng 1 năm 2009 lúc 19:12Jan 16, 2009 at 19:12

Tomvontomvontomvon

4.9013 Huy hiệu vàng21 Huy hiệu bạc16 Huy hiệu đồng3 gold badges21 silver badges16 bronze badges

10

Tôi cũng khuyên bạn nên sử dụng phương pháp hình thu nhỏ của PIL, bởi vì nó loại bỏ tất cả các rắc rối về tỷ lệ từ bạn.

Một gợi ý quan trọng, mặc dù: thay thế

im.thumbnail(size)

with

im.thumbnail(size,Image.ANTIALIAS)

Theo mặc định, PIL sử dụng bộ lọc Image.Nearest để thay đổi kích thước dẫn đến hiệu suất tốt, nhưng chất lượng kém.

Đã trả lời ngày 2 tháng 6 năm 2009 lúc 16:03Jun 2, 2009 at 16:03

FranzfranzFranz

1.2548 huy hiệu bạc2 huy hiệu đồng8 silver badges2 bronze badges

1

Dựa trên @tomvon, tôi đã hoàn thành bằng cách sử dụng phần sau (chọn trường hợp của bạn):

a) Chiều cao thay đổi kích thước (tôi biết chiều rộng mới, vì vậy tôi cần chiều cao mới)Resizing height (I know the new width, so I need the new height)

new_width  = 680
new_height = new_width * height / width 

b) Thay đổi kích thước chiều rộng (tôi biết chiều cao mới, vì vậy tôi cần chiều rộng mới)Resizing width (I know the new height, so I need the new width)

new_height = 680
new_width  = new_height * width / height

Sau đó chỉ:

img = img.resize((new_width, new_height), Image.ANTIALIAS)

Đã trả lời ngày 14 tháng 5 năm 2015 lúc 0:37May 14, 2015 at 0:37

MuzkmuzkmuZk

2.74820 Huy hiệu bạc22 Huy hiệu đồng20 silver badges22 bronze badges

5

Nếu bạn đang cố gắng duy trì tỷ lệ khung hình tương tự, thì bạn sẽ không thay đổi kích thước một phần trăm của kích thước ban đầu?

Ví dụ: một nửa kích thước ban đầu

half = 0.5
out = im.resize( [int(half * s) for s in im.size] )

Đã trả lời ngày 13 tháng 12 năm 2008 lúc 3:43Dec 13, 2008 at 3:43

5

from PIL import Image

img = Image.open('/your image path/image.jpg') # image extension *.png,*.jpg
new_width  = 200
new_height = 300
img = img.resize((new_width, new_height), Image.ANTIALIAS)
img.save('output image name.png') # format may what you want *.png, *jpg, *.gif

Uốn cong

2.8843 huy hiệu vàng17 Huy hiệu bạc36 Huy hiệu đồng3 gold badges17 silver badges36 bronze badges

Đã trả lời ngày 16 tháng 3 năm 2016 lúc 13:17Mar 16, 2016 at 13:17

3

Bạn có thể kết hợp

im.thumbnail(size,Image.ANTIALIAS)
6 của PIL với
im.thumbnail(size,Image.ANTIALIAS)
8 nếu giới hạn thay đổi kích thước của bạn chỉ ở một chiều (chiều rộng hoặc chiều cao).

Chẳng hạn, nếu bạn muốn thay đổi kích thước một hình ảnh để chiều cao của nó không quá 100px, trong khi giữ tỷ lệ khung hình, bạn có thể làm điều gì đó như thế này:

import sys
from PIL import Image

image.thumbnail([sys.maxsize, 100], Image.ANTIALIAS)

Hãy nhớ rằng

im.thumbnail(size,Image.ANTIALIAS)
6 sẽ thay đổi kích thước hình ảnh tại chỗ, khác với
new_width  = 680
new_height = new_width * height / width 
0 thay vào đó trả về hình ảnh thay đổi kích thước mà không thay đổi hình ảnh gốc.

EDIT:

new_width  = 680
new_height = new_width * height / width 
1 đưa ra cảnh báo từ chối và sẽ bị xóa trong PIL 10 (tháng 7 năm 2023). Thay vào đó, bạn nên sử dụng
new_width  = 680
new_height = new_width * height / width 
2:
:
new_width  = 680
new_height = new_width * height / width 
1 raises a deprecation warning, and will be removed in PIL 10 (July 2023). Instead, you should use
new_width  = 680
new_height = new_width * height / width 
2:

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
0

Đã trả lời ngày 26 tháng 1 năm 2021 lúc 15:40Jan 26, 2021 at 15:40

Vito Gentilevito GentileVito Gentile

12.5k9 Huy hiệu vàng58 Huy hiệu bạc91 Huy hiệu Đồng9 gold badges58 silver badges91 bronze badges

3

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
1

Tôi sử dụng thư viện này:

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
2

Đã trả lời ngày 27 tháng 9 năm 2015 lúc 10:02Sep 27, 2015 at 10:02

Guettliguettliguettli

23.9K66 Huy hiệu vàng308 Huy hiệu bạc582 Huy hiệu Đồng66 gold badges308 silver badges582 bronze badges

1

Nếu bạn không muốn / không có nhu cầu mở hình ảnh với gối, hãy sử dụng điều này:

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
3

Đã trả lời ngày 14 tháng 1 năm 2019 lúc 6:05Jan 14, 2019 at 6:05

hoohoo-bhoohoo-bhoohoo-b

1.05111 huy hiệu bạc11 huy hiệu đồng11 silver badges11 bronze badges

Chỉ cần cập nhật câu hỏi này với một trình bao bọc hiện đại hơn Thư viện này quấn gối (một cái nĩa của PIL) https://pypi.org/project/python-resize-image/

Cho phép bạn làm điều gì đó như thế này:-

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
4

Hàng đống nhiều ví dụ hơn trong liên kết trên.

Đã trả lời ngày 15 tháng 5 năm 2018 lúc 10:04May 15, 2018 at 10:04

ShannessshannessShanness

3552 Huy hiệu bạc10 Huy hiệu Đồng2 silver badges10 bronze badges

1

Mở tệp hình ảnh của bạn

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
5

Sử dụng PIL Image.Resize (Kích thước, Respample = 0), trong đó bạn thay thế (chiều rộng, chiều cao) của hình ảnh của bạn cho kích thước 2-Tuple.

Điều này sẽ hiển thị hình ảnh của bạn ở kích thước ban đầu:

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
6

Điều này sẽ hiển thị hình ảnh của bạn với kích thước 1/2:

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
7

Điều này sẽ hiển thị hình ảnh của bạn ở mức 1/3 kích thước:

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
8

Điều này sẽ hiển thị hình ảnh của bạn ở mức 1/4 kích thước:

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('somepic.jpg')
9

Vân vân

Đã trả lời ngày 18 tháng 2 năm 2020 lúc 4:40Feb 18, 2020 at 4:40

user391339user391339user391339

7.82713 Huy hiệu vàng52 Huy hiệu bạc71 Huy hiệu đồng13 gold badges52 silver badges71 bronze badges

2

Tôi cũng sẽ thêm một phiên bản thay đổi kích thước giữ cho tỷ lệ khung hình cố định. Trong trường hợp này, nó sẽ điều chỉnh chiều cao để phù hợp với chiều rộng của hình ảnh mới, dựa trên tỷ lệ khung hình ban đầu, ASP_RAT, là float (!). Nhưng, để điều chỉnh chiều rộng theo chiều cao, thay vào đó, bạn chỉ cần bình luận một dòng và không đưa vào vòng khác trong vòng lặp khác. Bạn sẽ thấy, ở đâu.float (!). But, to adjust the width to the height, instead, you just need to comment one line and uncomment the other in the else loop. You will see, where.

Bạn không cần các dấu chấm phẩy (;), tôi giữ chúng chỉ để nhắc nhở bản thân về cú pháp của các ngôn ngữ tôi sử dụng thường xuyên hơn.

im.thumbnail(size)
0

Và, nó được thực hiện. Tôi đã cố gắng ghi lại nó nhiều nhất có thể, vì vậy nó rõ ràng.

Tôi hy vọng nó có thể hữu ích cho ai đó ngoài kia!

Đã trả lời ngày 2 tháng 5 năm 2020 lúc 22:18May 2, 2020 at 22:18

RockogolicrockogolicRockOGOlic

1501 Huy hiệu bạc7 Huy hiệu đồng1 silver badge7 bronze badges

0

Tôi đã cố gắng thay đổi kích thước một số hình ảnh cho một video trình chiếu và do đó, tôi không chỉ muốn một kích thước tối đa, mà là chiều rộng tối đa và chiều cao tối đa (kích thước của khung video). Và luôn có khả năng của một video chân dung ... Phương pháp

im.thumbnail(size,Image.ANTIALIAS)
6 rất hứa hẹn, nhưng tôi không thể biến nó thành một hình ảnh nhỏ hơn.
And there was always the possibility of a portrait video...
The
im.thumbnail(size,Image.ANTIALIAS)
6 method was promising, but I could not make it upscale a smaller image.

Vì vậy, sau khi tôi không thể tìm thấy một cách rõ ràng để làm điều đó ở đây (hoặc ở một số nơi khác), tôi đã viết chức năng này và đặt nó ở đây cho những người đến:

im.thumbnail(size)
1

Đã trả lời ngày 22 tháng 1 năm 2019 lúc 18:02Jan 22, 2019 at 18:02

NoembryonoembryonoEmbryo

2.0862 huy hiệu vàng9 Huy hiệu bạc14 Huy hiệu đồng2 gold badges9 silver badges14 bronze badges

Đã cập nhật câu trả lời ở trên bởi "Tomvon"

im.thumbnail(size)
2

Đã trả lời ngày 18 tháng 9 năm 2019 lúc 10:17Sep 18, 2019 at 10:17

1

Một phương pháp đơn giản để giữ các tỷ lệ bị ràng buộc và vượt qua chiều rộng / chiều cao tối đa. Không phải là người đẹp nhất nhưng hoàn thành công việc và dễ hiểu:

im.thumbnail(size)
3

Dưới đây là tập lệnh Python sử dụng chức năng này để chạy thay đổi kích thước hình ảnh hàng loạt.

Đã trả lời ngày 31 tháng 5 năm 2018 lúc 6:40May 31, 2018 at 6:40

AlexalexAlex

10,8K6 Huy hiệu vàng61 Huy hiệu bạc71 Huy hiệu đồng6 gold badges61 silver badges71 bronze badges

Tôi đã thay đổi kích thước hình ảnh theo cách như vậy và nó hoạt động rất tốt

im.thumbnail(size)
4

Đã trả lời ngày 8 tháng 4 năm 2019 lúc 19:20Apr 8, 2019 at 19:20

Để làm cho hình ảnh mới một nửa chiều rộng và một nửa chiều cao của hình ảnh gốc, hãy sử dụng mã bên dưới:

im.thumbnail(size)
5

Để thay đổi kích thước với chiều rộng cố định với khẩu phần:

im.thumbnail(size)
6
im.thumbnail(size)
7

Đã trả lời ngày 16 tháng 11 năm 2021 lúc 13:04Nov 16, 2021 at 13:04

1

Ví dụ xấu xí của tôi.

Chức năng nhận tệp như: "pic [0-9a-z]. [Mở rộng]", thay đổi kích thước chúng thành 120x120, chuyển phần sang trung tâm và lưu đến "ICO [0-9A-Z]. [Tiện ích mở rộng]", hoạt động với chân dung và cảnh quan:

im.thumbnail(size)
8

Đã trả lời ngày 22 tháng 5 năm 2013 lúc 10:48May 22, 2013 at 10:48

NipsnipsNips

12.4K23 Huy hiệu vàng60 Huy hiệu bạc100 Huy hiệu đồng23 gold badges60 silver badges100 bronze badges

Cách đơn giản nhất làm việc cho tôi

im.thumbnail(size)
9

Thí dụ

im.thumbnail(size,Image.ANTIALIAS)
0

Đã trả lời ngày 18 tháng 9 năm 2021 lúc 7:32Sep 18, 2021 at 7:32

Kịch bản sau đây tạo ra hình thu nhỏ đẹp của tất cả các hình ảnh JPEG bảo tồn tỷ lệ khung hình với độ phân giải tối đa 128x128.

im.thumbnail(size,Image.ANTIALIAS)
1

Đã trả lời ngày 4 tháng 11 năm 2020 lúc 13:19Nov 4, 2020 at 13:19

Riz.KhanRiz.KhanRiz.Khan

3685 Huy hiệu bạc8 Huy hiệu Đồng5 silver badges8 bronze badges

im.thumbnail(size,Image.ANTIALIAS)
2

Đã trả lời ngày 15 tháng 1 lúc 7:00Jan 15 at 7:00

im.thumbnail(size,Image.ANTIALIAS)
3

Tối đa

3.6962 huy hiệu vàng8 Huy hiệu bạc24 Huy hiệu đồng2 gold badges8 silver badges24 bronze badges

Đã trả lời ngày 3 tháng 8 năm 2020 lúc 5:48Aug 3, 2020 at 5:48

1