gpt4 book ai didi

c# - 使用 RenderTargetBitmap 时如何获得高质量的文本?

转载 作者:行者123 更新时间:2023-11-30 17:41:18 29 4
gpt4 key购买 nike

我需要创建一个小而简单的 TIFF 图像,它只是白底黑字,作为我们在多个产品中使用的支持库的一部分。 (想想一张简单的收据或存单之类的东西)。我宁愿不必使用任何第三方库,以避免要求我们向使用该库的所有现有产品添加额外的依赖项。

根据 this question 中的代码,我几乎只使用 WPF 就解决了这个问题。 . TIFF 已正确创建和呈现,但文本质量很差。据我所知,问题是 RenderTargetBitmap,至少我使用它的方式,没有做任何类型的抗锯齿,没有使用 ClearType,或者以其他方式只是非常不擅长呈现纯文本,例如:

Sample Rendered Text

我读过类似的问题,比如this onethis one ,但他们似乎都在讨论如何在不降低质量的情况下从可视控件或窗口句柄中捕获文本。我完全是在屏幕外做这件事,所以我不清楚是否/如何将这些解决方案应用于我的问题。

我目前正在做的是:

var visual = new DrawingVisual();
using (var draw = visual.RenderOpen())
{
// 'background' is a pre-loaded blank white bitmap
draw.DrawImage(background, new Rect(0, 0, IMG_WIDTH, IMG_HEIGHT));

var font = new Typeface("Segoe UI");
Func<string, FormattedText> format = s => new FormattedText(
s,
CultureInfo.CurrentUICulture,
FlowDirection.LeftToRight,
font,
16,
Brushes.Black);

draw.DrawText(format("Some text"), new Point(HEADER_LEFT, HEADER_TOP);

// Call draw.DrawText a whole bunch more times.
.
.
.
}

var render = new RenderTargetBitmap(IMG_WIDTH, IMG_HEIGHT, IMG_DPI, IMG_DPI, PixelFormats.Default);
render.Render(visual);

var encoder = new TiffBitmapEncoder()
{
Compression = TiffCompressOption.Ccitt4
};
encoder.Frames.Add(BitmapFrame.Create(render));

var stream = new MemoryStream();
encoder.Save(stream);

还有什么我可以放在那里使文本质量比现在更好的东西吗?

最佳答案

不要使用 Ccitt4,它仅适用于黑白图像。请尝试使用 Default

更新:

这是一种 TT 字体,您试图以较小的尺寸呈现它,无论您做什么,它看起来都会很糟糕。不过,如果您坚持,则不要使用视觉效果。屏幕元素使用硬件加速,当您将它们与渲染目标一起使用时,它必须退回到软件方法,这种方法并不总是像素对像素相同。无论哪种方式,您总是至少会出现一些混叠。如果你真的想要正确的双色调,那么你将不得不使用一个将使用 GDI 的 Graphics 对象:

var bitmap = new Bitmap(512, 256);
var graphics = Graphics.FromImage(bitmap);
graphics.Clear(System.Drawing.Color.White);
var font = new Font("Segoe UI", 16);
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
graphics.DrawString("Hello World", font, System.Drawing.Brushes.Black, 0, 0);


ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/tiff");
var myEncoderParameters = new EncoderParameters(1);
myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
bitmap.Save(@"myimage.tif", myImageCodecInfo, myEncoderParameters);
graphics.Dispose();


private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}

结果(SO 本身有点模糊):

enter image description here

关于c# - 使用 RenderTargetBitmap 时如何获得高质量的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222523/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com