2014-09-06 34 views
7

Tôi là một nhiếp ảnh gia phim chuyên đề rất nhiều về việc cắt xén/thay đổi kích thước hình ảnh. Bởi vì tôi quay phim, tôi phải quét các âm bản của tôi và cắt từng khung hình ra khỏi quá trình quét hàng loạt. Máy quét của tôi quét bốn dải sáu hình ảnh mỗi (24 khung hình/vụ mỗi lần quét).Công cụ cắt ảnh (Python)

Một người bạn của tôi đã viết cho tôi một kịch bản cho Python tự động cắt hình ảnh dựa trên tọa độ đã nhập. Kịch bản hoạt động tốt nhưng nó có vấn đề trong định dạng tệp của hình ảnh đã xuất.

Từ lần quét, mỗi khung hình sẽ tạo ra TIFF 37MB ở mức 240 DPI (khi tôi cắt và xuất trong Adobe Lightroom). Thay vào đó, Cropper xuất ra 13MB 72 DPI TIFF.

Thiết bị đầu cuối (Tôi đang trên Mac) cảnh báo tôi về "Bom giải nén" bất cứ khi nào tôi chạy Cropper. Bạn của tôi là stumped và đề nghị tôi yêu cầu Stack tràn.

Tôi không có kinh nghiệm về Python. Tôi có thể cung cấp mã mà anh ta viết và lệnh Terminal cho tôi.

Suy nghĩ? Điều này sẽ được đánh giá rất nhiều và một lần rất lớn HUGE. CẢM ƠN BẠN!

ERROR MESSAGE: /Library/Python/2.7/site-packages/PIL/Image.py:2192: DecompressionBombWarning: Image size (208560540 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack. 

Trả lời

11

PIL đang cố gắng bảo vệ bạn. Nó sẽ không mở hình ảnh lớn hơn, vì đó có thể là một vectơ tấn công cho một người dùng độc hại để cung cấp cho bạn một hình ảnh lớn sẽ mở rộng để sử dụng hết bộ nhớ.

Kể từ khi bạn không phải là người sử dụng độc hại và không chấp nhận hình ảnh từ bất cứ ai khác, bạn có thể chỉ đơn giản là disable giới hạn:

from PIL import Image 

Image.MAX_IMAGE_PIXELS = None 

Thiết Image.MAX_IMAGE_PIXELS vô hiệu hóa việc kiểm tra hoàn toàn. Bạn cũng có thể đặt nó thành giá trị nguyên (cao); mặc định là int(1024 * 1024 * 1024/4/3), gần 90 triệu pixel hoặc khoảng 250MB dữ liệu không nén cho hình ảnh 3 kênh.

Lưu ý rằng theo mặc định, tất cả những gì xảy ra là cảnh báo được phát hành. Bạn cũng có thể vô hiệu hóa các cảnh báo:

import warnings 
from PIL import Image 

warnings.simplefilter('ignore', Image.DecompressionBombWarning) 
2

Từ Pillow docs:

Cảnh báo: Để bảo vệ chống lại tiềm năng tấn công DoS do "decompression bombs" (tức là tập tin độc hại mà giải nén vào một số lượng lớn dữ liệu và được thiết kế để gây sự cố hoặc gây gián đoạn do sử dụng nhiều bộ nhớ), Pillow sẽ phát hành DecompressionBombWarning nếu hình ảnh vượt quá giới hạn nhất định. Nếu muốn, cảnh báo có thể bị biến thành lỗi với warnings.simplefilter('error', Image.DecompressionBombWarning) hoặc bị chặn hoàn toàn với warnings.simplefilter('ignore', Image.DecompressionBombWarning). Xem thêm the logging documentation để có cảnh báo đầu ra cho cơ sở khai thác gỗ thay vì stderr.