更新:试过 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 相比,后者看起来很棒。
那么,我可以添加一些东西来使这项工作变得更好吗?还是我必须完全寻找另一种方法?
最佳答案
我的直接印象是你会遇到太多麻烦,因为你没有调整大小:
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);
}
}
}
关于c# - 使用 Bitmap.Save() 将 TIF 更好地转换为 PNG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12532538/