4

更新:試しSmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;てみましたが、フルズームで目立ちますが、問題は解決しません。問題はアンチエイリアス処理されただけです...

TIFはスキャンされたドキュメントであり、表やテキストの行などが含まれています。

現在のアプローチ:

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

var image = Image.FromFile(tifFileName);

Image bitmap = new Bitmap(image, (int)(image.Width), (int)(image.Height));

var imageFinal = new Bitmap(image.Width, image.Height);

var graphic = Graphics.FromImage(imageFinal);

graphic.DrawImage(image, 0, 0, image.Width, image.Height);

using(var imgStream = new MemoryStream())
{
    imageFinal.Save(imgStream, ImageFormat.Png);
    return new MemoryStream(imgStream.GetBuffer());
}

しかし、それはゴミのように見えてしまいます。たとえば、わずかに傾斜した線には階段のようなヒントがあり、テキストなどの他の細かい要素は粗く見えます。特に、GIMPを使用してTIFをPNGとして保存する場合と比較すると、見栄えがします。

それで、この作業をより良くするために私が追加できるものはありますか?それとも、別のアプローチを完全に見つける必要がありますか?

4

2 に答える 2

8

私の直接の印象は、サイズを変更していないので、あまりにも多くの問題が発生するということです。

var image = Image.FromFile(@"C:\Sample.tiff");
image.Save(@"C:\Sample.png", ImageFormat.Png);

イメージタイプを使用してもエイリアシングの問題が解決しない場合は、エンコーダを手動で選択してみてください。

#region Using Directives

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;

#endregion

namespace TiffToBitmap
{
    internal class Program
    {
        private static void Main()
        {
            // Just save the image.
            SaveImage(@"C:\Sample1.png", "image/tiff");

            // Get a byte array from the converted image.
            var imageBytes = GetBytes("image/tiff");

            // Save it for easy comparison.
            File.WriteAllBytes(@"C:\Sample2.png", imageBytes);
        }

        private static byte[] GetBytes(string mimeType)
        {
            var image = Image.FromFile(@"C:\Sample.tiff");

            var encoders = ImageCodecInfo.GetImageEncoders();
            var imageCodecInfo = encoders.FirstOrDefault(encoder => encoder.MimeType == mimeType);

            if (imageCodecInfo == null)
            {
                return null;
            }

            using (var memoryStream = new MemoryStream())
            {
                var imageEncoderParams = new EncoderParameters(1);
                imageEncoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
                image.Save(memoryStream, imageCodecInfo, imageEncoderParams);

                return memoryStream.GetBuffer();
            }
        }

        private static void SaveImage(string path, string mimeType)
        {
            var image = Image.FromFile(@"C:\Sample.tiff");

            var encoders = ImageCodecInfo.GetImageEncoders();
            var imageCodecInfo = encoders.FirstOrDefault(encoder => encoder.MimeType == mimeType);

            if (imageCodecInfo == null)
            {
                return;
            }

            var imageEncoderParams = new EncoderParameters(1);
            imageEncoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
            image.Save(path, imageCodecInfo, imageEncoderParams);
        }
    }
}
于 2012-09-21T15:08:36.733 に答える
1

これが私の画像/tiff型変換の実現です:

変換ブロック:

/// <summary>
/// Convert Tiff image to another mime-type
/// </summary>
/// <param name="tiffImage">Source Tiff file</param>
/// <param name="mimeType">Desired result mime-type</param>
/// <returns>Converted image</returns>
public Bitmap ConvertTiffToBitmap(Image tiffImage, string mimeType)
{
    var imageCodecInfo = ImageCodecInfo.GetImageEncoders().First(encoder => encoder.MimeType == MimeType.Tiff);

    using (var memoryStream = new MemoryStream())
    {
        // Setting encode params
        var imageEncoderParams = new EncoderParameters(1)
        {
            Param = {[0] = new EncoderParameter(Encoder.Quality, 100L)}
        };

        tiffImage.Save(memoryStream, imageCodecInfo, imageEncoderParams);

        var converter = new ImageConverter();

        // Reading stream data to new image
        var tempTiffImage = (Image)converter.ConvertFrom(memoryStream.GetBuffer());

        // Setting new result mime-type
        imageCodecInfo = ImageCodecInfo.GetImageEncoders().First(encoder => encoder.MimeType == mimeType);
        tempTiffImage?.Save(memoryStream, imageCodecInfo, imageEncoderParams);

        return new Bitmap(Image.FromStream(memoryStream, true));
    }
}

public static class MimeType
{
    public const string Bmp = "image/bmp";
    public const string Gif = "image/gif";
    public const string Jpeg = "image/jpeg";
    public const string Png = "image/png";
    public const string Tiff = "image/tiff";
}

使用法:

var sourceImg = Image.FromFile(@"C:\MyImage.tif", true);

var codec = ImageCodecInfo.GetImageDecoders().First(c => c.FormatID == sourceImg.RawFormat.Guid);
if (codec.MimeType == MimeType.Tiff)
{
    sourceImg = ConvertTiffToBitmap(sourceImg, MimeType.Jpeg);
}

願わくば、それは役に立つかもしれません

于 2014-02-19T04:49:36.477 に答える