2010-01-03 38 views
11

Một thời gian sau, tôi đã sử dụng dịch vụ tối ưu hóa PNG được gọi là (tôi nghĩ) "bôi nhọ nó". Bạn đã cho nó một liên kết web và nó trả về một zip của tất cả các hình ảnh PNG với các filesizes độc đáo, tốt, smushed ...Các công cụ tối ưu hóa PNG

Tôi muốn thực hiện một tính năng tối ưu hóa tương tự như một phần của quá trình tải lên hình ảnh của trang web của tôi; có ai biết về một thư viện có sẵn (PHP hoặc Python tốt hơn) mà tôi có thể khai thác cho điều này? Một Google ngắn gọn đã chỉ cho tôi hướng tới một số công cụ phong cách dòng lệnh, nhưng tôi không muốn đi xuống con đường đó nếu có thể.

+2

Tôi không nghĩ rằng bất kỳ công cụ phổ biến (optipng , pngcrush, et c.) có các ràng buộc. ImageMagick (cho PHP) và PIL (cho Python) sẽ đưa bạn đến một nơi nào đó bằng cách tinh chỉnh các thiết lập đầu ra, nhưng các công cụ dòng lệnh được tối ưu hóa nhiều hơn. –

Trả lời

14

Execute với PHP dòng lệnh này cụ

pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB -brute -l 9 -max -reduce -m 0 -q IMAGE 
    optipng -o7 -q pngout.png 
    pngout pngout.png -q -y -k0 -s0 
    advpng -z -4 pngout.png > /dev/null 
+1

hey, đã được 6 năm nhưng tôi nhận thấy bạn đã trực tuyến vì vậy - đây là một danh sách phong nha của các công cụ. bạn có thể liệt kê tất cả các công cụ nén cho png/jpg và tương tự không? Tôi chỉ cần một danh sách tên của những gì bạn sử dụng/thích, vì những công cụ này là tốt, tôi nghi ngờ bạn có thể đã tìm thấy một cái gì đó tốt hơn trong 6 năm :) Cảm ơn trước. trả lời tuyệt vời. – S00

3

Chừng nào PHP của bạn được biên soạn với sự hỗ trợ GD2 (khá phổ biến hiện nay):

<?php 
$image = imagecreatefromstring(file_get_contents('/path/to/image.original.png')); 
imagepng($image, '/path/to/image.smushed.png', 9); 

này sẽ đọc trong bất kỳ định dạng hình ảnh GD2 hiểu (không chỉ PNG) và đầu ra một PNG gzip như nén tối đa cấp mà không bị mất chất lượng.

Có thể ngày nay ít sử dụng hơn nhiều năm trước; hầu hết các biên tập viên hình ảnh đã làm điều này, vì gzipping không tốn nhiều CPU như trước đây.

+0

Cảm ơn, nhưng tôi là một cái gì đó mà đi xa hơn là chỉ gzipping, tức là loại bỏ hiệu chỉnh màu sắc và thông tin gamma. – Mathew

+0

Mặc dù tôi đồng ý có các kỹ thuật tối ưu hóa khác ngoài nén đơn giản, thực hiện những gì bạn đang yêu cầu không phải là _optimizing_, mà là _destroying_ hình ảnh đã tải lên. – Mike

+0

Bah! Ngữ nghĩa! :) Là một điểm chính xác mặc dù: Những gì tôi đang yêu cầu không phải là phá hủy hình ảnh trong bất kỳ cách nào, thay vì hình ảnh đang được tối ưu hóa bằng cách phá hủy một số phần (không cần thiết) thông tin. – Mathew

2

Bạn đã nghe nói về PNGCrush chưa? Bạn có thể kiểm tra nguồn, một phần của PNG and MNG Tools at SourceForge và phiên âm hoặc bọc nó trong Python.

+1

PNGcrush nhanh hơn bất kỳ giải pháp Python thuần túy nào, và việc gọi các chương trình bên ngoài rất dễ dàng bằng Python. Nhược điểm rõ ràng nhất là nếu hệ điều hành của bạn có chi phí cực cao để sinh ra một quy trình mới, ví dụ: Các cửa sổ. – Theran

+0

Tôi bằng cách nào đó nghi ngờ rằng việc tạo ra một quy trình mới cho mọi tệp tải lên là một ý tưởng hay, bất kể hệ điều hành của bạn là gì. – Eric

2

tôi sẽ đặt câu hỏi về sự khôn ngoan của vứt đi khối khác (như Gama và ICCP), nhưng nếu đó là những gì bạn muốn làm điều đó khá dễ dàng để sử dụng PyPNG để loại bỏ khối:

#!/usr/bin/env python 
import png 
import sys 

input=sys.stdin 
out=sys.stdout 

def critical_chunks(chunks): 
    for type,data in chunks: 
     if type[0].isupper(): 
      yield type,data 

chunks = png.Reader(file=input).chunks() 
png.write_chunks(out, critical_chunks(chunks)) 

các critical_chunks chức năng là về cơ bản lọc ra tất cả trừ các khối PNG quan trọng (loại 4 chữ cái cho một đoạn quan trọng bắt đầu bằng một chữ hoa).

+0

Điều này không thay đổi nén zlib, vì nó vượt qua các khối thông qua bị ảnh hưởng. –