Отключите сглаживание для черно-белого растрового изображения, созданного на холсте - PullRequest
1 голос
/ 01 июля 2011

У меня проблема с сглаживанием текста в WPF. В моем приложении пользователь создает поля текста или изображения для печати с помощью специального печатающего устройства. Я использую холст для размещения полей, которые являются либо текстовыми блоками, либо изображениями

Проблема в том, что когда я преобразую этот холст в RenderTargetBitmap, а затем в черно-белый FormatConvertedBitmap, текст и изображения выглядят очень размытыми.

Я попытался использовать "snaptodevicepixels = true" и "RenderOptions.EdgeMode" = с псевдонимами для всего в приложении. Я знаю, что сглаживание отлично подходит для экрана, но печать - это настоящая катастрофа.

Вот пример моего кода:

private BitmapSource GetCanvasAsBitmap(Canvas cvs)
  {   
   cvs.Background = Brushes.White;
   RenderOptions.SetEdgeMode(cvs, EdgeMode.Aliased);
   cvs.SnapsToDevicePixels = true;

   // render TopCanvas visual tree to the RenderTargetBitmap

   Size CanvasSize = new Size(cvs.Width, cvs.Height);
   cvs.Measure(CanvasSize);
   Rect CanvasRect = new Rect(CanvasSize);
   cvs.Arrange(CanvasRect);

   RenderTargetBitmap targetBitmap =
    new RenderTargetBitmap((int)cvs.ActualWidth,
     (int)cvs.ActualHeight,
     96, 96,
     PixelFormats.Default);

   targetBitmap.Render(cvs);


   double scale = PIXELSCALE / cvs.Height;
   ScaleTransform ST = new ScaleTransform(scale, scale);

   TransformedBitmap TB = new TransformedBitmap(targetBitmap, ST);

   return TB;
  }



  private static FormatConvertedBitmap Recolor(BitmapSource b)
  {   
   BmpBitmapEncoder encoder = new BmpBitmapEncoder();
   encoder.Frames.Add(BitmapFrame.Create(b));

   using (FileStream fs = new FileStream("BeforeRecolor.bmp", FileMode.Create))
   {
    encoder.Save(fs);    
    fs.Flush();
    fs.Close();
   }

   FormatConvertedBitmap FCB = new FormatConvertedBitmap(b, PixelFormats.Indexed1, new BitmapPalette(new List<Color>() { Colors.Black, Colors.White }), 0);

   BmpBitmapEncoder en = new BmpBitmapEncoder();
   en.Frames.Add(BitmapFrame.Create(FCB));

   using (FileStream fs = new FileStream("AfterRecolor.bmp", FileMode.Create))
   {
    en.Save(fs);
    fs.Flush();
    fs.Close();
   }

   return FCB;
  }

как отключить сглаживание перед созданием rendertargetbitmap?

1 Ответ

0 голосов
/ 05 октября 2014

http://blogs.msdn.com/b/dwayneneed/archive/2008/06/20/implementing-a-custom-bitmapsource.aspx

Видимо, тип дизеринга жестко закодирован

FormatConvertedBitmap

Этот класс использует стандартный формат пикселей WIC. конвертер (IWICImagingFactory :: CreateFormatConverter). Этот компонент предоставляет средства для преобразования из одного пиксельного формата в другой, обработка дизеринга и полутонов в индексированных форматах, палитра перевод и альфа-порог. Source, DestinationFormat, Свойства DestinationPalette и AlphaThreshold используются для инициализировать базовый компонент через IWICFormatConverter :: Initialize. Тип дизеринга жестко закодирован, чтобы быть WICBitmapDitherTypeErrorDiffusion. Тип перевода палитры: жестко закодированный, чтобы быть WICBitmapPaletteTypeMedianCut. ISupportInitialize интерфейс используется для привязки значений свойств, когда инициализация завершена. Дальнейшие изменения в свойствах игнорироваться.

...