2014-11-07 36 views
6

Cách tốt nhất để sửa nền đen khi chuyển đổi nhiều trang PDF sang JPG bằng phần mở rộng Imagick php là gì?Nền đen khi chuyển đổi nhiều trang PDF sang JPG với phần mở rộng Imagick php

Tiếp theo là các mã được sử dụng trên ứng dụng của tôi:

$imagick = new Imagick($file); 
    $imagick->setResolution(150,150); 
    $imagick->setImageFormat("jpg"); 
    $imagick->setImageCompression(imagick::COMPRESSION_JPEG); 
    $imagick->setImageCompressionQuality(70); 
    foreach ($imagick as $c => $_page) { 
     $_page->setImageBackgroundColor('white'); 
     $_page->adaptiveResizeImage($maxsize,$maxsize,true); 
     $_page->writeImage("$file-$c.jpg"); 
    } 

I'am biết rằng phương pháp flattenImage thể được sử dụng để loại bỏ nền đen, chẳng hạn như trong:

$imagick = $imagick->flattenImages(); 

Nhưng khi tệp có nhiều trang hơn, phương thức flattenImages đặt tất cả các trang trên cùng một hình ảnh và do đó kết quả là bản sao của trang cuối cùng trong tất cả các JPG được tạo.

Tôi đánh giá cao nếu có ai có thể giúp tôi.

+0

Bạn có thể đăng một tệp PDF mẫu không? – Danack

+0

Chắc chắn, đây là ví dụ: http://www.faceo.com.br/temp/Manual%20Split%20hiwall%20YORK-1.pdf và một trong các jpg được tạo: http: //www.faceo .com.br/temp/Manual% 20Split% 20hiwall% 20YORK-1.pdf-10.jpg – fcaserio

+1

Er, không có áp lực ... nhưng nếu nó giải quyết được vấn đề của bạn, làm thế nào 'bout nhấn nút chấp nhận đó? ;-) – Danack

Trả lời

6

đang làm việc đầu tiên - giải thích để làm theo:

Mã này hoạt động, nhưng là cực kỳ chậm:

$file = "./YORK.pdf"; 

$maxsize = 500; 

$imagick = new Imagick($file); 
$imagick->setResolution(150,150); 
$imagick->setImageFormat("jpg"); 
$imagick->setImageCompression(imagick::COMPRESSION_JPEG); 
$imagick->setImageCompressionQuality(70); 

foreach ($imagick as $c => $_page) { 
    $_page->setImageBackgroundColor('white'); 
    $_page->adaptiveResizeImage($maxsize,$maxsize,true); 
    $_page->setImageCompose(\Imagick::COMPOSITE_ATOP); 
    $_page->flattenImages(); 
    $_page->writeImage("$file-$c-compose.jpg"); 
} 

Mã này hoạt động và nhanh chóng:

foreach ($imagick as $c => $_page) { 
    $_page->setImageBackgroundColor('white'); 
    $_page->adaptiveResizeImage($maxsize,$maxsize,true); 
    $blankPage = new \Imagick(); 
    $blankPage->newPseudoImage($_page->getImageWidth(), $_page->getImageHeight(), "canvas:white"); 
    $blankPage->compositeImage($_page, \Imagick::COMPOSITE_ATOP, 0, 0); 
    $blankPage->writeImage("$file-$c.jpg"); 
} 

gì tôi nghĩ là xảy ra là khi nói đến việc viết hình ảnh ImageMagick đang làm:

  • Chuyển đổi các lớp riêng lẻ thành JPG
  • Hợp nhất chúng với nhau.

Đối với mỗi lớp có độ trong suốt vì JPG không hỗ trợ độ trong suốt, độ trong suốt là màu đen và sau đó hợp nhất. Đoạn mã trên làm cho việc tổng hợp được thực hiện theo đúng thứ tự.

Một cách khác để khắc phục sự cố là đặt đầu ra dưới dạng PNG. Vì nó hỗ trợ tính minh bạch, các lớp riêng lẻ với độ trong suốt được hợp nhất chính xác và sau đó bạn có thể chuyển đổi hình ảnh cuối cùng thành JPG nếu bạn thực sự muốn.

Sử dụng PNG làm định dạng trung gian cũng có thể tạo ra chất lượng cao hơn một chút vì nó có thể bỏ qua bước 'lưu vào JPG và giải mã'. Tôi khuyên bạn nên sử dụng PNG trong quy trình làm việc của bạn bất cứ khi nào có thể và sau đó chuyển đổi sang JPG chỉ khi bạn phân phát tệp cho người dùng cuối nếu bạn thực sự cần thêm chút nén.

+0

Tks người đàn ông, giải pháp tốt để đưa hình ảnh trên đầu trang của một vải trắng mới! – fcaserio

+0

Tôi vẫn gặp sự cố với nền đen xuất hiện trên một trang (đối với tôi đó là trang cuối cùng có văn bản + hình ảnh). Thay thế 'Imagick :: COMPOSITE_ATOP' bằng' Imagick :: COMPOSITE_OVER' dường như đang sửa nó – MarcinWolny

Các vấn đề liên quan