Lớp quan trọng nhất trong Thư viện hình ảnh Python là lớp, được định nghĩa trong mô-đun có cùng tên. Bạn có thể tạo các thể hiện của lớp này theo nhiều cách;
Để tải hình ảnh từ một tệp, hãy sử dụng chức năng trong mô-đun
>>> from PIL import Image >>> im = Image.open["hopper.ppm"]
Nếu thành công, hàm này trả về một đối tượng. Bây giờ bạn có thể sử dụng các thuộc tính thể hiện để kiểm tra nội dung tệp
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB
Thuộc tính xác định nguồn của hình ảnh. Nếu hình ảnh không được đọc từ một tệp, nó được đặt thành Không có. Thuộc tính kích thước là 2-tuple chứa chiều rộng và chiều cao [tính bằng pixel]. Thuộc tính xác định số lượng và tên của các dải trong ảnh, cũng như loại pixel và độ sâu. Các chế độ phổ biến là “L” [độ sáng] cho hình ảnh thang độ xám, “RGB” cho hình ảnh màu trung thực và “CMYK” cho hình ảnh in sẵn
Nếu tệp không thể mở được, một ngoại lệ sẽ được đưa ra
Khi bạn có một thể hiện của lớp, bạn có thể sử dụng các phương thức được định nghĩa bởi lớp này để xử lý và thao tác với hình ảnh. Ví dụ: hãy hiển thị hình ảnh chúng ta vừa tải
>>> im.show[]
Ghi chú
Phiên bản tiêu chuẩn không hiệu quả lắm, vì nó lưu hình ảnh vào một tệp tạm thời và gọi một tiện ích để hiển thị hình ảnh. Nếu bạn không cài đặt một tiện ích phù hợp, nó thậm chí sẽ không hoạt động. Tuy nhiên, khi nó hoạt động, nó rất thuận tiện để gỡ lỗi và kiểm tra
Các phần sau đây cung cấp tổng quan về các chức năng khác nhau được cung cấp trong thư viện này
Đọc và viết hình ảnh
Thư viện hình ảnh Python hỗ trợ nhiều định dạng tệp hình ảnh. Để đọc tệp từ đĩa, hãy sử dụng chức năng trong mô-đun. Bạn không cần phải biết định dạng tệp để mở tệp. Thư viện tự động xác định định dạng dựa trên nội dung của tệp
Để lưu tệp, hãy sử dụng phương thức của lớp. Khi lưu tệp, tên trở nên quan trọng. Trừ khi bạn chỉ định định dạng, thư viện sẽ sử dụng phần mở rộng tên tệp để khám phá định dạng lưu trữ tệp nào sẽ sử dụng
Chuyển đổi tập tin sang JPEG
import os, sys from PIL import Image for infile in sys.argv[1:]: f, e = os.path.splitext[infile] outfile = f + ".jpg" if infile != outfile: try: with Image.open[infile] as im: im.save[outfile] except OSError: print["cannot convert", infile]
Đối số thứ hai có thể được cung cấp cho phương thức chỉ định rõ ràng định dạng tệp. Nếu bạn sử dụng tiện ích mở rộng không chuẩn, bạn phải luôn chỉ định định dạng theo cách này
Tạo hình thu nhỏ JPEG
import os, sys from PIL import Image size = [128, 128] for infile in sys.argv[1:]: outfile = os.path.splitext[infile][0] + ".thumbnail" if infile != outfile: try: with Image.open[infile] as im: im.thumbnail[size] im.save[outfile, "JPEG"] except OSError: print["cannot create thumbnail for", infile]
Điều quan trọng cần lưu ý là thư viện không giải mã hoặc tải dữ liệu raster trừ khi nó thực sự cần thiết. Khi bạn mở tệp, tiêu đề tệp được đọc để xác định định dạng tệp và trích xuất những thứ như chế độ, kích thước và các thuộc tính khác cần thiết để giải mã tệp, nhưng phần còn lại của tệp không được xử lý cho đến sau này
Điều này có nghĩa là mở tệp hình ảnh là một thao tác nhanh, không phụ thuộc vào kích thước tệp và kiểu nén. Đây là một tập lệnh đơn giản để nhanh chóng xác định một tập hợp các tệp hình ảnh
Xác định tệp hình ảnh
import sys from PIL import Image for infile in sys.argv[1:]: try: with Image.open[infile] as im: print[infile, im.format, f"{im.size}x{im.mode}"] except OSError: pass
Cắt, dán và hợp nhất hình ảnh
Lớp chứa các phương thức cho phép bạn thao tác các vùng trong một hình ảnh. Để trích xuất một hình chữ nhật con từ một hình ảnh, hãy sử dụng phương pháp
Sao chép một hình chữ nhật con từ một hình ảnh
box = [100, 100, 400, 400] region = im.crop[box]
Vùng được xác định bởi 4-tuple, trong đó tọa độ là [trái, trên, phải, dưới]. Thư viện hình ảnh Python sử dụng hệ tọa độ với [0, 0] ở góc trên bên trái. Cũng lưu ý rằng tọa độ đề cập đến vị trí giữa các pixel, vì vậy vùng trong ví dụ trên chính xác là 300x300 pixel
Vùng hiện có thể được xử lý theo một cách nhất định và dán lại
Xử lý một hình chữ nhật con và dán lại
region = region.transpose[Image.Transpose.ROTATE_180] im.paste[region, box]
Khi dán lại các vùng, kích thước của vùng phải khớp chính xác với vùng đã cho. Ngoài ra, khu vực không thể mở rộng ra bên ngoài hình ảnh. Tuy nhiên, các chế độ của ảnh gốc và vùng không cần phải khớp. Nếu không, khu vực sẽ tự động được chuyển đổi trước khi được dán [xem phần bên dưới để biết chi tiết]
Đây là một ví dụ bổ sung
Cuộn một hình ảnh
________số 8
Hoặc nếu bạn muốn hợp nhất hai hình ảnh thành một hình ảnh rộng hơn
Hợp nhất hình ảnh
def merge[im1, im2]: w = im1.size[0] + im2.size[0] h = max[im1.size[1], im2.size[1]] im = Image.new["RGBA", [w, h]] im.paste[im1] im.paste[im2, [im1.size[0], 0]] return im
Đối với các thủ thuật nâng cao hơn, phương thức dán cũng có thể lấy mặt nạ trong suốt làm đối số tùy chọn. Trong mặt nạ này, giá trị 255 cho biết rằng hình ảnh đã dán bị mờ ở vị trí đó [nghĩa là hình ảnh đã dán nên được sử dụng nguyên trạng]. Giá trị 0 có nghĩa là hình ảnh đã dán hoàn toàn trong suốt. Các giá trị ở giữa cho biết các mức độ minh bạch khác nhau. Ví dụ: dán một hình ảnh RGBA và cũng sử dụng nó làm mặt nạ sẽ dán phần mờ của hình ảnh chứ không phải nền trong suốt của nó
Thư viện hình ảnh Python cũng cho phép bạn làm việc với các dải riêng lẻ của hình ảnh nhiều dải, chẳng hạn như hình ảnh RGB. Phương pháp phân tách tạo ra một tập hợp các hình ảnh mới, mỗi hình ảnh chứa một dải từ hình ảnh nhiều dải ban đầu. Hàm hợp nhất lấy một chế độ và một bộ ảnh rồi kết hợp chúng thành một ảnh mới. Mẫu sau hoán đổi ba dải của hình ảnh RGB
Tách và hợp nhất các dải
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB0
Lưu ý rằng đối với hình ảnh một dải, trả về chính hình ảnh đó. Để làm việc với các dải màu riêng lẻ, trước tiên bạn có thể muốn chuyển đổi hình ảnh thành “RGB”
phép biến đổi hình học
Lớp chứa các phương thức và một hình ảnh. Cái trước lấy một tuple cho kích thước mới, cái sau lấy góc theo độ ngược chiều kim đồng hồ
Biến đổi hình học đơn giản
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB1
Để xoay hình ảnh theo các bước 90 độ, bạn có thể sử dụng phương pháp hoặc phương pháp. Cái sau cũng có thể được sử dụng để lật hình ảnh quanh trục ngang hoặc dọc của nó
Chuyển đổi một hình ảnh
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB2
Các thao tác
import sys from PIL import Image for infile in sys.argv[1:]: try: with Image.open[infile] as im: print[infile, im.format, f"{im.size}x{im.mode}"] except OSError: pass3 cũng có thể được thực hiện giống hệt với các thao tác, miễn là cờ
import sys from PIL import Image for infile in sys.argv[1:]: try: with Image.open[infile] as im: print[infile, im.format, f"{im.size}x{im.mode}"] except OSError: pass5 là đúng, để cung cấp các thay đổi tương tự đối với kích thước của hình ảnh
Một hình thức biến đổi hình ảnh tổng quát hơn có thể được thực hiện thông qua phương pháp
biến đổi màu sắc
Thư viện hình ảnh Python cho phép bạn chuyển đổi hình ảnh giữa các biểu diễn pixel khác nhau bằng phương thức
Chuyển đổi giữa các chế độ
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB3
Thư viện hỗ trợ chuyển đổi giữa từng chế độ được hỗ trợ và chế độ “L” và “RGB”. Để chuyển đổi giữa các chế độ khác, bạn có thể phải sử dụng một hình ảnh trung gian [thường là hình ảnh “RGB”]
Nâng cao hình ảnh
Thư viện hình ảnh Python cung cấp một số phương thức và mô-đun có thể được sử dụng để nâng cao hình ảnh
bộ lọc
Mô-đun chứa một số bộ lọc nâng cao được xác định trước có thể được sử dụng với phương thức
Áp dụng bộ lọc
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB4
Hoạt động điểm
Phương pháp này có thể được sử dụng để dịch các giá trị pixel của một hình ảnh [e. g. thao tác tương phản hình ảnh]. Trong hầu hết các trường hợp, một đối tượng hàm mong đợi một đối số có thể được truyền cho phương thức này. Mỗi pixel được xử lý theo chức năng đó
Áp dụng biến đổi điểm
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB5
Sử dụng kỹ thuật trên, bạn có thể nhanh chóng áp dụng bất kỳ biểu thức đơn giản nào cho hình ảnh. Bạn cũng có thể kết hợp các phương thức và để sửa đổi có chọn lọc một hình ảnh
Xử lý các dải riêng lẻ
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB6
Lưu ý cú pháp được sử dụng để tạo mặt nạ
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB7
Python chỉ đánh giá một phần của biểu thức logic khi cần thiết để xác định kết quả và trả về giá trị cuối cùng được kiểm tra là kết quả của biểu thức. Vì vậy, nếu biểu thức trên là sai [0], Python không nhìn vào toán hạng thứ hai và do đó trả về 0. Nếu không, nó trả về 255
Sự nâng cao
Để cải thiện hình ảnh nâng cao hơn, bạn có thể sử dụng các lớp trong mô-đun. Sau khi được tạo từ một hình ảnh, một đối tượng nâng cao có thể được sử dụng để nhanh chóng thử các cài đặt khác nhau
Bạn có thể điều chỉnh độ tương phản, độ sáng, cân bằng màu sắc và độ sắc nét theo cách này
Tăng cường hình ảnh
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB8
Chuỗi hình ảnh
Thư viện hình ảnh Python chứa một số hỗ trợ cơ bản cho chuỗi hình ảnh [còn được gọi là định dạng hoạt ảnh]. Các định dạng trình tự được hỗ trợ bao gồm FLI/FLC, GIF và một vài định dạng thử nghiệm. Các tệp TIFF cũng có thể chứa nhiều hơn một khung hình
Khi bạn mở tệp trình tự, PIL sẽ tự động tải khung hình đầu tiên trong trình tự. Bạn có thể sử dụng các phương thức tìm kiếm và cho biết để di chuyển giữa các khung hình khác nhau
Trình tự đọc
>>> print[im.format, im.size, im.mode] PPM [512, 512] RGB9
Như đã thấy trong ví dụ này, bạn sẽ nhận được một ngoại lệ khi chuỗi kết thúc
Lớp sau cho phép bạn sử dụng câu lệnh for để lặp qua chuỗi
Sử dụng lớp ImageSequence Iterator
>>> im.show[]0
in PostScript
Thư viện hình ảnh Python bao gồm các chức năng in hình ảnh, văn bản và đồ họa trên máy in PostScript. Đây là một ví dụ đơn giản
Vẽ PostScript
>>> im.show[]1
Thêm về đọc hình ảnh
Như đã mô tả trước đó, chức năng của mô-đun được sử dụng để mở tệp hình ảnh. Trong hầu hết các trường hợp, bạn chỉ cần chuyển tên tệp làm đối số.
box = [100, 100, 400, 400] region = im.crop[box]7 có thể được sử dụng làm trình quản lý ngữ cảnh
>>> im.show[]2
Nếu mọi thứ suôn sẻ, kết quả là một đối tượng. Nếu không, một ngoại lệ được nêu ra
Bạn có thể sử dụng một đối tượng giống như tệp thay vì tên tệp. Đối tượng phải triển khai các phương thức
region = region.transpose[Image.Transpose.ROTATE_180] im.paste[region, box]0,
region = region.transpose[Image.Transpose.ROTATE_180] im.paste[region, box]1 và
region = region.transpose[Image.Transpose.ROTATE_180] im.paste[region, box]2 và được mở ở chế độ nhị phân
Đọc từ một tệp đang mở
>>> im.show[]3
Để đọc một hình ảnh từ dữ liệu nhị phân, hãy sử dụng lớp
Đọc từ dữ liệu nhị phân
>>> im.show[]4
Lưu ý rằng thư viện sẽ tua lại tệp [sử dụng
region = region.transpose[Image.Transpose.ROTATE_180] im.paste[region, box]4] trước khi đọc tiêu đề hình ảnh. Ngoài ra, seek cũng sẽ được sử dụng khi dữ liệu hình ảnh được đọc [theo phương thức load]. Nếu tệp hình ảnh được nhúng trong một tệp lớn hơn, chẳng hạn như tệp tar, bạn có thể sử dụng các mô-đun hoặc để truy cập tệp đó
Đọc từ URL
>>> im.show[]5
Đọc từ kho lưu trữ tar
>>> im.show[]6
Xử lý hàng loạt
Có thể áp dụng các thao tác cho nhiều tệp hình ảnh. Ví dụ: tất cả hình ảnh PNG trong thư mục hiện tại có thể được lưu dưới dạng JPEG với chất lượng giảm
>>> im.show[]7
Vì hình ảnh cũng có thể được mở từ
region = region.transpose[Image.Transpose.ROTATE_180] im.paste[region, box]7 từ mô-đun
region = region.transpose[Image.Transpose.ROTATE_180] im.paste[region, box]8, ví dụ này có thể được sửa đổi để sử dụng
region = region.transpose[Image.Transpose.ROTATE_180] im.paste[region, box]8 thay vì mô-đun
def roll[im, delta]: """Roll an image sideways.""" xsize, ysize = im.size delta = delta % xsize if delta == 0: return im part1 = im.crop[[0, 0, delta, ysize]] part2 = im.crop[[delta, 0, xsize, ysize]] im.paste[part1, [xsize - delta, 0, xsize, ysize]] im.paste[part2, [0, 0, xsize - delta, ysize]] return im0
>>> im.show[]8
Điều khiển bộ giải mã
Một số bộ giải mã cho phép bạn thao tác với hình ảnh trong khi đọc nó từ một tệp. Điều này thường có thể được sử dụng để tăng tốc độ giải mã khi tạo hình thu nhỏ [khi tốc độ thường quan trọng hơn chất lượng] và in bằng máy in laser đơn sắc [khi chỉ cần một phiên bản thang độ xám của hình ảnh]
Phương pháp thao tác với một hình ảnh đã mở nhưng chưa được tải để nó khớp với chế độ và kích thước đã cho nhất có thể. Điều này được thực hiện bằng cách cấu hình lại bộ giải mã hình ảnh
Đọc ở chế độ nháp
Điều này chỉ khả dụng cho các tệp JPEG và MPO
>>> im.show[]9
Điều này in một cái gì đó giống như
import os, sys from PIL import Image for infile in sys.argv[1:]: f, e = os.path.splitext[infile] outfile = f + ".jpg" if infile != outfile: try: with Image.open[infile] as im: im.save[outfile] except OSError: print["cannot convert", infile]0
Lưu ý rằng hình ảnh kết quả có thể không khớp chính xác với chế độ và kích thước được yêu cầu. Để đảm bảo rằng hình ảnh không lớn hơn kích thước đã cho, thay vào đó hãy sử dụng phương pháp hình thu nhỏ