web-dev-qa-db-ja.com

さまざまな画像形式(jpg、gif、pngなど)をTIFF形式に変換する

OCRを介して画像からテキストを読み取る作業をしています。 TIFF形式の画像のみをサポートします。

したがって、他の形式をTIFF形式に変換する必要があります。できますか?いくつかの参照を提供することによって助けてください。

18
user1509

.NETでImageオブジェクトを作成すると、TIFFとして保存できます。これは、多くの ImageFormat の選択肢の1つです。

例:

var png = Image.FromFile("some.png");
png.Save("a.tiff", ImageFormat.Tiff);

プロジェクトにSystem.Drawingアセンブリを含める必要があります。そのアセンブリは多くの画像操作機能を提供します。お役に立てば幸いです。

22
Jacob

イントロ注:

  1. この回答は、賞金問題をカバーしています。つまり、複数のファイルを1つのtiffに変換するにはどうすればよいでしょうか。たとえば、pdf、jpeg、pngがあり、それらから1つのtiffを作成したいとしますか?
  2. この回答では、画像操作に https://imagemagick.org/index.php の.net実装を使用し、AI/EPS/PDF/PSファイルの読み取りを支援するためにGhostscriptを使用して、翻訳できるようにします画像ファイルへの信頼性と公式のソースの両方です。
  3. この質問に回答した後、他のマージオプションを尋ねるメールで追加の質問を受け取ったので、回答を拡張しました。

IMO目標には2つのステップがあります。

  1. PDF変換に必要なツールをインストールする
  2. PDF形式のファイルを含むすべての画像をソースから取得し、それらを1つのtiffファイルにマージします。

1. PDFからイメージへの変換に役立つツールをインストールします。

ステップ1は、AI/EPS/PDF/PSファイル形式を変換する場合にのみ必要です。それ以外の場合は、ステップ2にジャンプします。

PDFを任意の画像形式に変換できるようにするには、PDFファイルを読み取ることができるライブラリと、それを画像タイプに変換するツールが必要です。この目的のために、 Ghostscript (GNU Affero General Public License)をインストールする必要があります。

その後、Visual Studioの.netに ImageMagick.net をインストールする必要があります。nuget link です。

ここまでは順調ですね。

2.コード部分

2番目と最後のステップは、フォルダーの場所からファイル(png、jpg、bmp、pdfなど)を読み取り、各ファイルをMagickImageCollectionに追加する必要があります。次に、AppendHorizontallyをマージするためのいくつかのオプションがあります。 AppendVerticallyMontageまたは複数ページのTiff。 ImageMagickには、サイズ変更、解像度などの多くの機能があります。これは、機能のマージを示すための単なる例です。

public static void MergeImage(string src, string dest, MergeType type = MergeType.MultiplePage)
{
    var files = new DirectoryInfo(src).GetFiles();

    using (var images = new MagickImageCollection())
    {
        foreach (var file in files)
        {
            var image = new MagickImage(file)
            {
                Format = MagickFormat.Tif,
                Depth = 8,
            };
            images.Add(image);
        }

        switch (type)
        {
            case MergeType.Vertical:
                using (var result = images.AppendVertically())
                {
                    result.AdaptiveResize(new MagickGeometry(){Height = 600, Width = 800});
                    result.Write(dest);
                }
                break;
            case MergeType.Horizontal:
                using (var result = images.AppendHorizontally())
                {
                    result.AdaptiveResize(new MagickGeometry(){Height = 600, Width = 800});
                    result.Write(dest);
                }
                break;
            case MergeType.Montage:
                var settings = new MontageSettings
                {
                    BackgroundColor = new MagickColor("#FFF"),
                    Geometry = new MagickGeometry("1x1<")
                };

                using (var result = images.Montage(settings))
                {
                    result.Write(dest);
                }
                break;
            case MergeType.MultiplePage:
                images.Write(dest);
                break;
            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, "Un-support choice");
        }

        images.Dispose();
    }
}

public enum MergeType
{
    MultiplePage,
    Vertical,
    Horizontal,
    Montage
}

コードを実行するには

public static void Main(string[] args)
{
    var src = @"C:\temp\Images";
    var dest1 = @"C:\temp\Output\MultiplePage.tiff";
    var dest2 = @"C:\temp\Output\Vertical.tiff";
    var dest3 = @"C:\temp\Output\Horizontal.tiff";
    var dest4 = @"C:\temp\Output\Montage.tiff";

    MergeImage(src, dest1);
    MergeImage(src, dest2, MergeType.Vertical);
    MergeImage(src, dest3, MergeType.Horizontal);
    MergeImage(src, dest4, MergeType.Montage);
}

C:\ temp\Imagesに4つの入力ファイルがあります。

enter image description hereenter image description hereenter image description hereenter image description here

コードを実行すると、C:\ temp\Outputの下に次のような4つの新しいファイルが作成されます。

enter image description here 4ページの複数ページのTiff

enter image description here 4画像の垂直マージ

enter image description here 4画像の水平マージ

enter image description here 4画像モンタージュマージ

最後の注意:

  1. system.Drawingを使用して複数の画像をtiffにマージすることが可能です。 System.Drawing.Imagingを使用します。 ImageMagickを使用せずに、pdfにはサードパーティの変換ライブラリまたはツールが必要なので、C#にはGhostscriptとImageMagickを使用します。
  2. ImageMagickには多くの機能があるため、解像度、出力ファイルのサイズなどを変更できます。これはよく認識されているライブラリです。

免責事項:この回答の一部は私の個人的なWebサイトから取得されます https://itbackyard.com/how-to-convert-ai-eps-pdf-ps-to-image-file/ githubへのソースコード付き。

Tif形式で画像を変換します。以下の例では、画像を変換してテキストボックスに設定します。テキストボックス内の画像を表示するには(.tif formate)です。このソースコードは機能しています。

private void btn_Convert(object sender, EventArgs e)
    {
        string newName = System.IO.Path.GetFileNameWithoutExtension(CurrentFile);
        newName = newName + ".tif";
        try
        {
            img.Save(newName, ImageFormat.Tiff);
        }
        catch (Exception ex)
        {
            string error = ee.Message.ToString();
            MessageBox.Show(MessageBoxIcon.Error);

        }
        textBox2.Text = System.IO.Path.GetFullPath(newName.ToString());
    }
4
Bibin

ImageMagickコマンドラインはそれを簡単に行うことができます。ほとんどのLinuxシステムで提供されており、MacまたはWindowsでも使用できます。参照 https://imagemagick.org/script/download.php

convert image.suffix -compress XXX image.tiff


または、次を使用してファイルのフォルダ全体を処理できます

mogrify -format tiff -path path/to/output_directory *


ImageMagickは、複数の画像をマルチページTIFFに結合することをサポートしています。また、画像はPDFを含む場合でも混合タイプにすることができます。

convert image1.suffix1 image2.suffix2 ... -compress XXX imageN.suffixN output.tiff


さまざまな圧縮形式または圧縮なしから選択できます。

見る

https://imagemagick.org/script/command-line-processing.php

https://imagemagick.org/Usage/basics/

https://imagemagick.org/Usage/basics/#mogrify

https://imagemagick.org/script/command-line-options.php#compress


または、C#インターフェイスにMagick.Netを使用できます。 https://github.com/dlemstra/Magick.NET を参照してください

メインのImageMagickページは https://imagemagick.org にあります。

サポートされているフォーマットは https://imagemagick.org/script/formats.php にリストされています

画像を簡単に処理して、サイズ変更、グレースケールへの変換、フィルター(シャープ)、しきい値などをすべて同じコマンドラインで実行できます。

見る

https://imagemagick.org/Usage/

https://imagemagick.org/Usage/reference.html

3
fmw42

これは、ウェブサイトにアップロードされた画像を変換する方法です。 Tiffファイルを出力するように変更しました。メソッドはバイト配列を入出力するため、さまざまな方法で簡単に使用できます。ただし、簡単に変更できます。

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

public byte[] ConvertImageToTiff(byte[] SourceImage)
{
    //create a new byte array
    byte[] bin = new byte[0];

    //check if there is data
    if (SourceImage == null || SourceImage.Length == 0)
    {
        return bin;
    }

    //convert the byte array to a bitmap
    Bitmap NewImage;
    using (MemoryStream ms = new MemoryStream(SourceImage))
    {
        NewImage = new Bitmap(ms);
    }

    //set some properties
    Bitmap TempImage = new Bitmap(NewImage.Width, NewImage.Height);
    using (Graphics g = Graphics.FromImage(TempImage))
    {
        g.CompositingMode = CompositingMode.SourceCopy;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.DrawImage(NewImage, 0, 0, NewImage.Width, NewImage.Height);
    }
    NewImage = TempImage;

    //save the image to a stream
    using (MemoryStream ms = new MemoryStream())
    {
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L);

        NewImage.Save(ms, GetEncoderInfo("image/tiff"), encoderParameters);
        bin = ms.ToArray();
    }

    //cleanup
    NewImage.Dispose();
    TempImage.Dispose();

    //return data
    return bin;
}


//get the correct encoder info
public ImageCodecInfo GetEncoderInfo(string MimeType)
{
    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
    for (int j = 0; j < encoders.Length; ++j)
    {
        if (encoders[j].MimeType.ToLower() == MimeType.ToLower())
            return encoders[j];
    }
    return null;
}

テストする

var oldImage = File.ReadAllBytes(Server.MapPath("OldImage.jpg"));
var newImage = ConvertImageToTiff(oldImage);
File.WriteAllBytes(Server.MapPath("NewImage.tiff"), newImage);
2
VDWWD

これをjpg、bmp、png、gifでテストしました。ティフの単一および複数ページの作成に役立ちます。ファイルへのフルパス名を渡します。それが誰かを助けることを願っています。 (MSDNから抽出)

public static string[] ConvertJpegToTiff(string[] fileNames, bool isMultipage)
    {
        EncoderParameters encoderParams = new EncoderParameters(1);
        ImageCodecInfo tiffCodecInfo = ImageCodecInfo.GetImageEncoders()
            .First(ie => ie.MimeType == "image/tiff");

        string[] tiffPaths = null;
        if (isMultipage)
        {
            tiffPaths = new string[1];
            System.Drawing.Image tiffImg = null;
            try
            {
                for (int i = 0; i < fileNames.Length; i++)
                {
                    if (i == 0)
                    {
                        tiffPaths[i] = String.Format("{0}\\{1}.tif",
                            Path.GetDirectoryName(fileNames[i]),
                            Path.GetFileNameWithoutExtension(fileNames[i]));

                        // Initialize the first frame of multipage tiff.
                        tiffImg = System.Drawing.Image.FromFile(fileNames[i]);
                        encoderParams.Param[0] = new EncoderParameter(
                            System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
                        tiffImg.Save(tiffPaths[i], tiffCodecInfo, encoderParams);
                    }
                    else
                    {
                        // Add additional frames.
                        encoderParams.Param[0] = new EncoderParameter(
                            System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
                        using (System.Drawing.Image frame = System.Drawing.Image.FromFile(fileNames[i]))
                        {
                            tiffImg.SaveAdd(frame, encoderParams);
                        }
                    }

                    if (i == fileNames.Length - 1)
                    {
                        // When it is the last frame, flush the resources and closing.
                        encoderParams.Param[0] = new EncoderParameter(
                            System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush);
                        tiffImg.SaveAdd(encoderParams);
                    }
                }
            }
            finally
            {
                if (tiffImg != null)
                {
                    tiffImg.Dispose();
                    tiffImg = null;
                }
            }
        }
        else
        {
            tiffPaths = new string[fileNames.Length];

            for (int i = 0; i < fileNames.Length; i++)
            {
                tiffPaths[i] = String.Format("{0}\\{1}.tif",
                    Path.GetDirectoryName(fileNames[i]),
                    Path.GetFileNameWithoutExtension(fileNames[i]));

                // Save as individual tiff files.
                using (System.Drawing.Image tiffImg = System.Drawing.Image.FromFile(fileNames[i]))
                {
                    tiffImg.Save(tiffPaths[i], ImageFormat.Tiff);
                }
            }
        }

        return tiffPaths;
    }
2
wbt11a