2

複数ページの tiff ファイルでバーコード認識を実行しようとしています。しかし、Tiff ファイルは、Tiff を非正方形のピクセル アスペクト比で保存するファックス サーバー (私には制御できません) から送られてきます。これにより、アスペクト比が原因で画像がひどく押しつぶされます。tiff を正方形ピクセルの縦横比に変換する必要がありますが、C# でそれを行う方法がわかりません。また、アスペクト比を変更しても画像が判読できるように、画像を引き伸ばす必要があります。

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

4

4 に答える 4

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)));
    }
}
于 2009-10-25T23:20:06.820 に答える
0

免責事項: 私は Atalasoft で働いています

当社の.NET イメージング SDKはこれを行うことができます。製品の使用方法を示すKB 記事を作成しましたが、他の SDK に適応することができます。基本的に、画像を再サンプリングして DPI を調整する必要があります。

于 2009-05-21T14:47:04.860 に答える
0

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

このページをご覧ください。サイズ変更の 2 つのメカニズムについて説明します。あなたの場合、バイリニアフィルタリングは実際には悪い考えだと思います。おそらく、素敵でモノクロにしたいからです。

以下は、単純なサイズ変更アルゴリズム (上記のリンク先のページから Christian Graus によって作成されたもの) のコピーです。

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;
}

別のメカニズムは、このGetThumbNailImageように関数を悪用することです。そのコードはアスペクト比を維持しますが、それを行うコードを削除するのは簡単なはずです。

于 2009-05-20T21:15:19.213 に答える
0

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

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

于 2009-05-20T21:37:31.137 に答える