2015-10-19 75 views
3

我需要在白色背景上創建一個小而簡單的TIFF圖像,該圖像只是黑色文本,作爲我們在多個產品中使用的支持庫的一部分。 (想想簡單的收據或存款票,那種事)。我寧願不必使用任何第三方庫,以避免要求我們向使用該庫的所有現有產品添加額外的依賴關係。如何在使用RenderTargetBitmap時獲得高質量的文本?

根據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); 

有沒有別的東西,我可以把那裏獲取文本的質量比它是什麼更好?

+0

所以,雙色調是必需的。字體的選​​擇是否也是一項要求?對於小的雙色調圖像,我想知道,如果可以限制足夠的用例,位圖字體(等)不是最佳選擇 - 您需要多大的尺寸? –

+0

不,字體是隨意的,我可以挑選大小約爲10-14的任何東西。我會嘗試一些其他的。 –

回答

1

請勿使用Ccitt4,它僅適用於黑白圖像。改爲嘗試Default

UPDATE:

這是一個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; 
    } 

結果(這原來是模糊一點本身):

enter image description here

+0

在這種情況下,CCITT4是一項要求,並且我看到了大量高質量的雙色文本圖像。 –

+0

出於某種原因,我厭惡GDI +用於TIFF,但在這種情況下,工作很簡單。感謝您的推動:) –

相關問題