2009-05-20 5 views
2

私はマルチページのTIFFファイルでバーコード認識を実行しようとしています。しかし、tiffファイルは、正方形でないピクセルアスペクト比でtiffを保存するファックスサーバー(私は制御できません)から私に来ています。これにより、画像がアスペクト比のためにひどく潰れてしまいます。 TIFFを正方形ピクセルのアスペクト比に変換する必要がありますが、C#でそれを行う方法はわかりません。私はまた、アスペクト比を変えても画像を見やすくするために画像を伸ばす必要があります。tiffピクセルのアスペクト比を正方形に変更してください

C#でこれを行った人はいますか?または、誰もそのような手順を実行する画像ライブラリを使用していますか?

答えて

6

他の誰かが同じ問題に遭遇した場合は、ここで私はこの厄介な問題を修正した超簡単な方法です。

using System.Drawing; 
using System.Drawing.Imaging; 

// The memoryStream contains multi-page TIFF with different 
// variable pixel aspect ratios. 
using (Image img = Image.FromStream(memoryStream)) { 
    Guid id = img.FrameDimensionsList[0]; 
    FrameDimension dimension = new FrameDimension(id); 
    int totalFrame = img.GetFrameCount(dimension); 
    for (int i = 0; i < totalFrame; i++) { 
     img.SelectActiveFrame(dimension, i); 

     // Faxed documents will have an non-square pixel aspect ratio. 
     // If this is the case,adjust the height so that the 
     // resulting pixels are square. 
     int width = img.Width; 
     int height = img.Height; 
     if (img.VerticalResolution < img.HorizontalResolution) { 
      height = (int)(height * img.HorizontalResolution/img.VerticalResolution); 
     } 

     bitmaps.Add(new Bitmap(img, new Size(width, height))); 
    } 
} 
+0

あなたの先生は、私のヒーローです! –

+0

誰もこのコードのJava版を持っていますか? – gtiwari333

0

ああ、私は言及するのを忘れました。 Bitmap.SetResolutionはアスペクト比の問題に役立つ場合があります。以下のものはサイズ変更についてです。

チェックアウトThis page。サイズ変更の2つのメカニズムについて説明します。あなたの事例では、双線形フィルタリングは実際には良いアイデアだと思っています。以下は

はあなたが望むものでなければなりません(上記のリンク先のページから、クリスチャン・グラウスによって書かれた)ナイーブサイズ変更アルゴリズムのコピーです。

public static Bitmap Resize(Bitmap b, int nWidth, int nHeight) 
{ 
    Bitmap bTemp = (Bitmap)b.Clone(); 
    b = new Bitmap(nWidth, nHeight, bTemp.PixelFormat); 

    double nXFactor = (double)bTemp.Width/(double)nWidth; 
    double nYFactor = (double)bTemp.Height/(double)nHeight; 

    for (int x = 0; x < b.Width; ++x) 
     for (int y = 0; y < b.Height; ++y) 
      b.SetPixel(x, y, bTemp.GetPixel((int)(Math.Floor(x * nXFactor)), 
         (int)(Math.Floor(y * nYFactor)))); 

    return b; 
} 

代替メカニズムはthisようGetThumbNailImage機能を悪用することです。そのコードはアスペクト比を維持しますが、それを行うコードを削除するのは簡単です。

0

私はFreeImage(オープンソース)とSnowboundという2つの画像ライブラリでこれを行っています。 (かなり高価です)FreeImageにはC#ラッパーがあり、Snowboundは.NETアセンブリで利用できます。どちらもうまくいく。

コードでサイズを変更するのは不可能ではありませんが、2色のTIFFはGDI +では扱いにくいことがあります。

0

免責事項:私はAtalasoft

で働く私たちの.NET imaging SDKこれを行うことができます。私たちの製品の使い方を示すためにa KB articleと書いていますが、他のSDKにも対応できます。基本的には、画像をリサンプリングしてDPIを調整する必要があります。

関連する問題