2008-09-18 20 views
5

Tôi hiện đang sử dụng ImageMagick để xác định kích thước hình ảnh được tải lên trang web. Bằng cách gọi ImageMagick là "xác định" trên dòng lệnh, nó mất khoảng 0,42 giây để xác định kích thước của 1MB JPEG cùng với thực tế là nó là một JPEG. Tôi thấy hơi chậm.Cách nhanh nhất để xác định độ phân giải hình ảnh và loại tệp trong dòng lệnh PHP hoặc Unix?

Sử dụng thư viện ảnh Imagick PHP thậm chí còn chậm hơn khi nó tải toàn bộ 1MB vào bộ nhớ trước khi thực hiện bất kỳ điều trị nào cho hình ảnh (trong trường hợp này, chỉ cần xác định kích thước và loại của nó).

Có giải pháp nào để tăng tốc quá trình xác định loại tệp nào và kích thước nào mà tệp hình ảnh tùy ý có? Tôi có thể sống với nó chỉ hỗ trợ JPEG và PNG. Điều quan trọng với tôi là loại tệp được xác định bằng cách xem các tiêu đề của tệp và không chỉ đơn giản là phần mở rộng.

Edit: Các giải pháp có thể là một công cụ dòng lệnh UNIX gọi bằng PHP, giống như cách tôi đang sử dụng ImageMagick tại thời điểm

Trả lời

3

Rất tiếc, tôi không thể thêm nhận xét này làm nhận xét cho câu trả lời trước nhưng tôi không có đại diện. Làm một số thử nghiệm nhanh chóng và bẩn tôi cũng thấy rằng exec ("xác định -ping ... là khoảng 20 lần nhanh hơn mà không cần -ping. Nhưng getimagesize() dường như là khoảng 200 lần nhanh hơn vẫn còn.

Vì vậy, tôi sẽ nói getimagesize() là phương pháp nhanh hơn. tôi chỉ thử nghiệm trên jpg và không phải trên png.

bài kiểm tra chỉ là

$files = array('2819547919_db7466149b_o_d.jpg', 'GP1-green2.jpg', 'aegeri-lake-switzerland.JPG'); 
foreach($files as $file){ 
    $size2 = array(); 
    $size3 = array(); 
    $time1 = microtime(); 
    $size = getimagesize($file); 
    $time1 = microtime() - $time1; 
    print "$time1 \n"; 
    $time2 = microtime(); 
    exec("identify -ping $file", $size2); 
    $time2 = microtime() - $time2; 
    print $time2/$time1 . "\n"; 
    $time2 = microtime(); 
    exec("identify $file", $size3); 
    $time2 = microtime() - $time2; 
    print $time2/$time1 . "\n"; 
    print_r($size); 
    print_r($size2); 
    print_r($size3); 
} 
+0

Nhưng GD có cung cấp cách xác định loại tệp theo nội dung của nó (và không phải là phần mở rộng được chỉ định của nó) không? Ngoài ra, bạn phải đo thời gian để tải hình ảnh vào GD, vì tôi không thực hiện bất kỳ quá trình xử lý nào khác ngoài việc xác định kích thước tệp. – Gilles

+0

Tôi đã thêm bài kiểm tra vào câu trả lời của mình. Tôi không biết liệu GD có tải toàn bộ tệp hình ảnh vào bộ nhớ hay không vì tôi không xem bộ nhớ. Nhưng tôi bắt kịp thời gian hoàn thành để lệnh chạy. Ngoài ra getimagesize() cũng trả về loại mime. –

+0

Cảm ơn tất cả những nỗ lực, tôi đã thử nghiệm nó trực tiếp và nó thực sự nhanh hơn 250 lần so với giải pháp -ping. Vì vậy, khoảng 5000 lần nhanh hơn so với phương pháp ban đầu tôi đã sử dụng, không phải là xấu :) – Gilles

7

Nếu bạn đang sử dụng PHP với sự hỗ trợ GD, bạn có thể hãy thử getimagesize().

+0

GD có thể sẽ gặp phải vấn đề tốc độ tương tự vì nó sẽ tải hình ảnh trong bộ nhớ ... – Gilles

+0

Đúng. Tôi không biết cách nào khác ngoài việc tự viết nó và chỉ lưu trữ một phần của hình ảnh trong bộ nhớ tại một thời điểm, nhưng điều này sẽ phụ thuộc vào loại hình ảnh. –

2

Điều quan trọng với tôi là loại tệp được xác định bằng cách xem tiêu đề của tệp và không chỉ đơn giản là phần mở rộng.

Đối với điều đó bạn có thể sử dụng lệnh 'unix' unix (chức năng orsome php thực hiện cùng chức năng).

/tmp$ file stackoverflow-logo-250.png
stackoverflow-logo-250.png: PNG image data, 250 x 70, 8-bit colormap, non-interlaced

+0

Tôi vừa thử nghiệm điều này một cách nhanh chóng trong dòng lệnh và có vẻ như khá chậm, mất một giây để xác định loại tệp của JPG. Nó dường như để lưu trữ kết quả nhưng đó là ít quan tâm, như tôi sẽ kiểm tra hình ảnh chỉ một lần. – Gilles

+0

Một phần của nó có lẽ là thời gian cần để phân tích cú pháp tập tin ma thuật. Bạn có thể chạy tệp trên toàn bộ một loạt hình ảnh cùng một lúc. Hoặc bạn có thể tạo một tệp ma thuật nhỏ hơn chỉ với các loại tệp hình ảnh phổ biến. – palm3D

4

Các bạn đã thử

identify -ping filename.png 

?

+0

Cuộc gọi tốt, nhanh hơn khoảng 20 lần :) Mô tả tùy chọn đó khiến tôi tự hỏi tại sao nó không phải là hành vi mặc định của nhận diện? Dù sao, vấn đề được giải quyết và cảm ơn rất nhiều. – Gilles

2

Trên thực tế, sử dụng getimagesize(), bạn làm KHÔNG cần phải có GD biên soạn trong.

Bạn cũng có thể sử dụng mime_content_type() để có được những kiểu MIME.

1

exif_imagetype() là nhanh hơn so với getimagesize().

$ filename = "somefile";
$ data = exif_imagetype ($ filename);
echo "<PRE>";
print_r ($ data);
echo "</PRE >";

đầu ra:

 
Array (
     [FileName] => somefile 
     [FileDateTime] => 1234895396 
     [FileSize] => 15427 
     [FileType] => 2 
     [MimeType] => image/jpeg 
     [SectionsFound] => 
     [COMPUTED] => Array 
      (
       [html] => width="229" height="300" 
       [Height] => 300 
       [Width] => 229 
       [IsColor] => 1 
     ) 
) 

0

Nếu bạn đang sử dụng PHP tôi muốn đề nghị sử dụng thư viện Imagick thay vì gọi exec(). Tính năng bạn đang tìm kiếm là Imagick::pingImage().