2014-03-31 107 views
1

我有以下代碼來操作和壓縮TIFF圖像。LZW壓縮方法不使用imagick壓縮TIFF圖像

<?php 

try{ 
    $imagesrc = "C:\\server\\www\\imagick\\src.tif"; 
    $imagedestination = "C:\\server\\www\\imagick\\converted.tif"; 
    $im=new Imagick(); 
    $im->readImage($imagesrc); //read image for manipulation 
    $im->setImageColorSpace(Imagick::COLORSPACE_CMYK); 

    $im->setImageDepth(8); //8 Bit 

    $im->setImageResolution(300,300); //set output resolution to 300 dpi 
    $im->setImageUnits(1); //0=undefined, 1=pixelsperInch, 2=PixelsPerCentimeter 
    $im->setImageCompression(Imagick::COMPRESSION_LZW); 
    $im->setImageCompressionQuality(80); 
    $im->writeImage($imagedestination); 
    $im->clear(); 
    $im->destroy(); 
    $im=NULL; 
}catch(ImagickException $e){ 
    echo "Could not convert image - ".$e->getMessage(); 
} 
?> 

源圖像是19MB。當我使用此代碼時,生成的TIF圖像大約爲25MB。也就是說,代碼根本不壓縮圖像。此外,其它的壓縮方法沒有效果上得到的TIFF文件,但然而如果我使用的壓縮方法Imagick::COMPRESSION_JPEG,得到的圖像是2MB

我不能使用JPEG壓縮,因爲我米使用所得TIFF圖像與itextsharp在PDF中嵌入。 JPEG壓縮會導致itextsharp不支持的多條帶tiff圖像。

所以我的問題有兩種可能的答案。而且其中的任何一個答案都適用於我

  1. 如何有效壓縮tif?
  2. 如何將多條帶tif圖像轉換爲單條。

感謝

+0

'源圖像是19MB' - 這聽起來像一個相當大的圖像,因爲COMPRESSION_LZW/q = 0.8會生成更大的文件。圖像的尺寸是給定的,不能改變? – VolkerK

+0

你的圖片的尺寸是多少? –

+0

@VolkerK,我們可以在質量上妥協,但不能在圖像維度上妥協。圖片尺寸爲3655x3735像素。源圖片尺寸和尺寸可能因用戶上傳的內容而異。 – WatsMyName

回答

1

用php-imagick擺弄讓我無處,所以我嘗試Magick.NET
只有通過設置rows-per-strip定義的數字大於圖像中的行(即#strips = 1),iTextSharp纔會使用CompressionMethod.JPEG接受圖像。
但它仍然無法正常工作。我在計算機上的所有圖像查看器都能正確呈現圖像,但在PDF文檔中已損壞。
而我發現這個論壇條目http://itext-general.2136553.n4.nabble.com/TIFF-with-color-pages-COMPRESS-JPEG-problem-td3686051.html

Jpeg壓縮tiff圖像並不真正支持iText,它們可能工作,但很可能不是。
不知道Paulo Soares-3的權限是多麼的權威,但我放棄了。
因此:這不是一個答案。但也許你想用.NET端口撥弄一樣,所以這裏是我的測試代碼 - 好運:

using iTextSharp.text; 
using iTextSharp.text.pdf; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace imagick_itext_test 
{ 
    class Program 
    { 
     static Image getNormalizedImage(string path) 
     { 
      Image rv; 
      using (MemoryStream mems = new MemoryStream()) 
      { 
       using (ImageMagick.MagickImage image = new ImageMagick.MagickImage(path)) 
       { 
        image.Format = ImageMagick.MagickFormat.Tiff; 
        image.ResolutionUnits = ImageMagick.Resolution.PixelsPerInch; 
        image.Depth = 300; 
        image.BitDepth(8); // for printing you said? ;-) 
        image.Adjoin = false; // is there multi-image in jpeg anyway? 
        image.Interlace = ImageMagick.Interlace.Jpeg; // try Interlace.Plane and Interlace.No 
        image.CompressionMethod = ImageMagick.CompressionMethod.JPEG; // everything's fine when using .LZW here 
        image.Quality = 35; // 85, 80 not even 50 got me significant reduction in file size (src size=18MB) 
        //image.SetDefine(ImageMagick.MagickFormat.Tiff, "rows-per-strip", image.Height.ToString()); 
        image.SetDefine(ImageMagick.MagickFormat.Tiff, "rows-per-strip", "8192"); 
        image.Strip(); // remove additional data, e.g. comments 
        image.Write(mems); 
       } 

       // store the tiff(jpeg) image for inspection 
       using (FileStream fos = new FileStream(@"c:\temp\so_conv.tiff", FileMode.Create)) 
       { 
        mems.Position = 0; 
        mems.CopyTo(fos); 
       } 
       mems.Position = 0; 
       rv = Image.GetInstance(mems); 
       //rv.ScalePercent(24f); // works for me ... 
      } 
      return rv; 
     } 

     static void Main(string[] args) 
     { 
      using (Document doc = new Document()) 
      { 
       using (PdfWriter w = PdfWriter.GetInstance(doc, new FileStream(@"c:\temp\so_pdf_test.pdf", FileMode.Create))) 
       { 
        doc.Open(); 
        doc.SetMargins(50, 50, 50, 50); 
        doc.Add(new Paragraph("SO Image Test")); 
        doc.Add(getNormalizedImage(@"c:\temp\src.tif")); 
        doc.Close(); 
       } 
      } 
     } 
    } 
} 

VS2012 - .NET 4.5,ImageMagick的-6.8.8-10-Q16-64靜電。 EXE
兩個Magick.NET和iTextSharp的已經通過的NuGet添加到項目:

  • iTextSharp的5.50
  • Magick.NET-Q16-64 6.8.8.901
0

我得從什麼在TIFF =中最好省略JPEG,是最小的。 然後是ZIP壓縮,然後是LZW,然後是RLE。

**輸入文件:jpeg 500kb。在TIFF 1.25MB * JPEG * ZIP 2.0MB * LZW 2.5MB * LRE 3.2MB

一件事 - 爲TIFF壓縮不要設置質量,因爲它是loseless格式 - 它只是它(套忽略到100數數)。您可以將它設置爲tiff的jpeg壓縮 - 沒有其他。

但是你可以做的是在保存之前添加行$im->stripImage();。這會從文件中去除一些信息 - 可能會使它變小。

另請檢查您的Imagick版本我是:ImageMagick 6.7.7-7 2012-06-21 Q16,它運作良好。