C# 使用位图.Save()进行更好的TIF到PNG转换?
更新:尝试C# 使用位图.Save()进行更好的TIF到PNG转换?,c#,bitmap,png,tiff,C#,Bitmap,Png,Tiff,更新:尝试SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.antialas在全缩放时很明显,但这并不能解决问题,问题只是消除了锯齿 TIF是扫描文档,包含表格行和文本行等内容 目前的做法: using System.Drawing; using System.Drawing.Imaging; var image = Image.FromFile(tifFileName); Image bitmap = new Bitmap(i
SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.antialas
在全缩放时很明显,但这并不能解决问题,问题只是消除了锯齿
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相比,它看起来很棒
那么,有什么我可以补充,使这项工作更好吗?还是我必须完全找到另一种方法?我的直接印象是,由于您没有调整大小,您会遇到太多麻烦:
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);
}
}
}
下面是我对图像/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";
}
希望,它能有用我对这个藏书室不熟悉,但应该在某处有一个安提亚利亚斯的旗帜。它将加载并保存您的图片,而不使用阶梯线。我应该包括这一点,它是系统。绘图,虽然这并不意味着您对它更熟悉,但我想我至少可以为您命名它。啊,我实际上遗漏了一个if语句,它确实可以调整大小,因为我当前的问题是在没有它的情况下发生的,然而,这并不意味着你给我的东西不会起作用,现在就试试吧,如果这不起作用,请给我发一个TIFF示例,我会把它搞定。如果我需要帮助的话,我们有一个家伙对这些东西很在行。仅供参考,在办公室里,我们经常使用这个SDK来完成成像任务。它的API一开始可能有点混乱,但它工作得非常非常好:上面的代码绝对不是线程安全的。您可能希望删除静态修饰符,并将图像处理封装在每个线程的一个实例中。它是一种较新的类型,旨在直接处理PNG。他还说,还有一种TiffBitmapDecoder类型用于控制读取该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);
}