5.21. Tỷ lệ, lật và cắt xén¶
Các tiểu mục trước đều làm việc trên các điểm ảnh ở cùng vị trí ban đầu. Nhóm biến đổi thay đổi điều đó. Thay đổi tỷ lệ đưa mỗi điểm ảnh đầu vào đến một vị trí đầu ra khác, có thể đến nhiều vị trí đầu ra cùng lúc (khi phóng to) hoặc đến một vị trí chung với nhiều điểm ảnh đầu vào khác (khi thu nhỏ). Lật và xoay thực hiện điều tương tự thông qua một phép ánh xạ khác. Cắt xén giữ lại một tập con hình chữ nhật của các điểm ảnh đầu vào và loại bỏ phần còn lại.
Module image hiển thị nhóm đó thông qua ba phương thức chia sẻ hầu hết các đối số và hành vi của chúng:
copy()-- tạo một bản sao của ảnh, có thể được chia tỷ lệ, cắt xén hoặc định hướng lại.crop()-- cùng thao tác nhưcopy, nhưng với mong đợi rằng ứng dụng sẽ chọn một hình chữ nhật con từ nguồn.scale()-- tương tự, với mong đợi rằng ứng dụng sẽ thay đổi kích thước kết quả.
Ba phương thức dùng chung các đối số và cùng một máy biến đổi; sự khác biệt là kết quả mặc định được đặt ở đâu. copy() tạo ra một ảnh mới, trong khi crop() và scale() chỉnh sửa nguồn tại chỗ.
5.21.2. Nội suy: AREA, BILINEAR, BICUBIC¶
Khi chia tỷ lệ đưa mỗi điểm ảnh đầu ra đến một vị trí không thẳng hàng với bất kỳ điểm ảnh đầu vào đơn lẻ nào, phương thức phải chọn giá trị nào để ghi. Ba cờ kiểm soát cách làm:
image.BILINEAR nội suy giữa bốn điểm ảnh đầu vào gần nhất được trọng số theo khoảng cách của chúng đến vị trí đầu ra. Kết quả mượt mà hơn so với lấy mẫu lân cận gần nhất, không có răng cưa trên các đường chéo, nhưng phép tính thêm tốn khoảng bốn lần so với lần lượt lân cận gần nhất. Lựa chọn phù hợp cho hầu hết công việc phóng to và cho bất kỳ hệ số tỷ lệ không phải số nguyên nào.
image.BICUBIC nội suy giữa mười sáu điểm ảnh đầu vào gần nhất sử dụng đường cong bậc ba, tạo ra kết quả mượt mà hơn với chi phí tính toán nhiều hơn. Chất lượng tốt nhất cho các ứng dụng nhạy cảm chi phí cần đến nó; hiếm khi đáng với phép tính thêm cho các khung hình trực tiếp mà IDE chỉ hiển thị.
image.AREA lấy trung bình mọi điểm ảnh đầu vào nằm trong vùng chiếu của điểm ảnh đầu ra -- thuật toán đúng đắn cho việc thu nhỏ. Bilinear và bicubic là các bộ nội suy: chúng ước tính giá trị giữa các điểm ảnh nguồn, đây là điều mà phóng to cần, nhưng khi thu nhỏ mỗi điểm ảnh đầu ra bao phủ nhiều điểm ảnh nguồn và bộ nội suy chỉ đọc vài điểm gần nhất -- chi tiết bị bỏ qua quay lại dưới dạng aliasing. image.AREA gộp mọi điểm ảnh được bao phủ vào trung bình thay thế.
Thuật toán chia tỷ lệ mặc định không có bất kỳ gợi ý nào là lân cận gần nhất, vốn rẻ nhất và là câu trả lời đúng khi nguồn đã ở độ phân giải điểm ảnh của đích.
5.21.3. Định hướng: lật và xoay¶
Các cờ định hướng là một tập nhỏ các phép biến đổi boolean kết hợp tự do với nhau và với các cờ nội suy:
image.VFLIPlật ảnh theo chiều dọc (trên trở thành dưới).image.HMIRRORlật ảnh theo chiều ngang (trái trở thành phải).image.TRANSPOSEhoán đổi trục x và y (hàng trở thành cột).
Hầu hết các phép xoay đến từ việc kết hợp ba phép đó. Module cũng cung cấp các tên gọi tắt:
image.ROTATE_90(=VFLIP | TRANSPOSE)image.ROTATE_180(=HMIRROR | VFLIP)image.ROTATE_270(=HMIRROR | TRANSPOSE)
Trong code:
img.copy(hint=image.ROTATE_90, copy_to_fb=True)
5.21.4. Xử lý tỷ lệ khung hình¶
Khi tỷ lệ khung hình của nguồn không khớp với hình chữ nhật mà nó đang được vẽ vào, ba cờ quyết định cách xử lý sự không khớp:
image.SCALE_ASPECT_KEEP bảo toàn tỷ lệ khung hình của nguồn và thêm dải đen vào kết quả -- nguồn được chia tỷ lệ cho đến khi vừa trong đích, với các điểm ảnh trống (bằng không) lấp đầy phần còn lại của đích. Lựa chọn phù hợp khi việc giữ nguồn không bị biến dạng quan trọng hơn việc lấp đầy toàn bộ đầu ra.
image.SCALE_ASPECT_EXPAND bảo toàn tỷ lệ khung hình của nguồn và cắt xén nó -- nguồn được chia tỷ lệ cho đến khi lấp đầy đích, với các phần vượt quá đích bị cắt bỏ. Lựa chọn phù hợp khi việc lấp đầy toàn bộ đầu ra quan trọng hơn việc nhìn thấy mọi phần của nguồn.
image.SCALE_ASPECT_IGNORE bỏ qua tỷ lệ khung hình và kéo dài nguồn để lấp đầy đích, chấp nhận bất kỳ biến dạng nào điều đó gây ra. Lựa chọn phù hợp khi ứng dụng đã tính đến biến dạng -- khi kích thước của đích thực ra không phải là hình chữ nhật của cùng một cảnh, chẳng hạn.
Mặc định (không có cờ khung hình nào được đặt) giống như SCALE_ASPECT_IGNORE: kéo dài để lấp đầy. Các ứng dụng quan tâm đến tỷ lệ khung hình chỉ định rõ một trong ba cờ.
5.21.5. Khi nào dùng cái nào¶
Hầu hết các thay đổi kích thước sử dụng scale() với cặp x_scale / y_scale và một gợi ý nội suy:
img.scale(x_scale=0.5, y_scale=0.5, hint=image.AREA)
Hầu hết các phép xoay sử dụng cùng lời gọi với hint=image.ROTATE_90 hoặc tương tự.
Cắt xén sử dụng crop() với một roi không mặc định:
img.crop(roi=(40, 30, 200, 150))
Khi nguồn phải tồn tại sau thao tác -- chụp một khung tham chiếu, lấy thumbnail của một khung sắp được xử lý theo cách phá hủy -- copy() tạo ra kết quả dưới dạng một ảnh mới và giữ nguyên nguồn:
thumbnail = img.copy(x_scale=0.25, y_scale=0.25, hint=image.AREA)
Mặc định đó là sự khác biệt thực sự đằng sau ba tên: scale và crop biến đổi tại chỗ, copy cấp phát. Các từ khóa đặt kết quả bắc cầu khoảng cách: copy=True trên scale hoặc crop cấp phát kết quả dưới dạng một bộ đệm heap riêng thay vì ghi đè nguồn, và copy_to_fb=True trên bất kỳ cái nào trong ba cái đặt nó vào bộ đệm khung hình để xem trước trong IDE.