C # / VB.NET: как улучшить качество сглаживания

Вопрос:
В Reporting Service мне нужен вертикальный, начиная снизу, снизу вверх, горизонтально выровненный по центру текст.

Единственный способ сделать это - создать изображение в коде и поместить это изображение в столбец заголовка.

См. Код ниже.

В принципе, он работает нормально, просто качество сглаживания довольно дрянное.
Могу ли я что-нибудь сделать, чтобы его улучшить?
См. Ниже снимок экрана:

Проблема SSRS

Вертикальный текст какой-то бледный, а не полностью черный,
, а также есть размытие по всему тексту в цвете фона. Кроме того, он выглядит более жирным, чем текст слева, но оба имеют формат arial, размер 8, жирный.

Я пробовал все другие значения
System.Drawing.Text.TextRenderingHint . *, а также никакого антиалиаса

но нынешний кажется наименее хреновым. Я также пытался изменить формат изображения, но безрезультатно:

Function LoadImage2(ByVal sImageText As String, ByVal sImageTextMax As String) As System.Drawing.Image
    sImageTextMax = sImageTextMax.PadRight(15)
    Dim iFontSize As Integer = 8 '//Change this as needed
    Dim bmpImage As New System.Drawing.Bitmap(1, 1)
    Dim iWidth As Integer = 0
    Dim iHeight As Integer = 0
    Dim bgColor As System.Drawing.Color = System.Drawing.Color.LemonChiffon ' LightGray
    Dim TextColor As System.Drawing.Color = System.Drawing.Color.Black

    Dim fsFontStyle As System.Drawing.FontStyle = System.Drawing.FontStyle.Bold

    '// Create the Font object for the image text drawing.
    Dim MyFont As New System.Drawing.Font("Arial", iFontSize, fsFontStyle, System.Drawing.GraphicsUnit.Point)
    '// Create a graphics object to measure the text's width and height.
    'Graphics(MyGraphics = Graphics.FromImage(bmpImage))
    Dim MyGraphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmpImage)
    '// This is where the bitmap size is determined.
    iWidth = MyGraphics.MeasureString(sImageTextMax, MyFont).Width
    iHeight = MyGraphics.MeasureString(sImageTextMax, MyFont).Height
    '// Create the bmpImage again with the correct size for the text and font.
    'bmpImage = New Drawing.Bitmap(bmpImage, New Drawing.Size(iWidth, iHeight))

    'inches = pixels / dpi
    'pixel = inches * dpi
    '1 centimeter = 0.393700787 inch
    'pixel = cm * 0.393700787  * dpi


    ' vice-versa, because 270° turn
    iHeight = 1 * 0.393700787 * bmpImage.HorizontalResolution 'x DPI
    iWidth = 2.25 * 0.393700787 * bmpImage.VerticalResolution 'y DPI


    bmpImage = New System.Drawing.Bitmap(bmpImage, New System.Drawing.Size(iHeight, iWidth))

    '// Add the colors to the new bitmap.
    MyGraphics = System.Drawing.Graphics.FromImage(bmpImage)
    MyGraphics.Clear(bgColor)
    MyGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias

    MyGraphics.TranslateTransform(0, iWidth)
    MyGraphics.RotateTransform(270)

    Dim iTextStartX As Single = 2
    Dim iTextStartY As Single = CSng(iHeight) / CSng(2.0) - CSng(iFontSize) / CSng(2.0)
    iTextStartY -= 2

    MyGraphics.DrawString(sImageText, MyFont, New System.Drawing.SolidBrush(TextColor), iTextStartX, iTextStartY)
    MyGraphics.Flush()
    Return bmpImage
End Function


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me.PictureBox1.Image = LoadImage2("test", "")
End Sub



' This piece is only needed in reporting service itselfs
Function LoadImage(ByVal strText As String) As Byte()
    Dim ThisImageFormat As System.Drawing.Imaging.ImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg


    Dim stream As System.IO.MemoryStream = New System.IO.MemoryStream
    Dim bitmapBytes As Byte()
    Dim bmpImage As System.Drawing.Image = LoadImage2(strText, "")


    bmpImage.Save(stream, ThisImageFormat)
    bitmapBytes = stream.ToArray
    stream.Close()
    bmpImage.Dispose()
    Return bitmapBytes
End Function

person Stefan Steiger    schedule 16.08.2011    source источник
comment
Это может быть полезно и позволит избежать использования изображений для визуализации текста: msdn.microsoft. ru / en-us / library / da9f790s.aspx   -  person Rodaine    schedule 16.08.2011


Ответы (3)


У меня была эта проблема, но только в некоторых браузерах. Я думаю, что это проблема браузера (IE). Firefox и Chrome вроде бы в порядке.

В конце концов я решил вручную создавать свои отчеты в html и использовать HighCharts для графики. Затем я преобразовал все это в PDF с помощью wkHTMLtoPDF

Он собрался довольно хорошо, и проблемы с анти-псевдонимом исчезли. Я думаю, что вы можете столкнуться с этими проблемами в SQL Reporting Services.

person Matt    schedule 16.08.2011
comment
Это не проблема браузера, это изображение из обработанного PDF-файла, и оно выглядит ужасно во всех браузерах, кстати, в конце концов, это изображение. - person Stefan Steiger; 16.08.2011
comment
wkHTMLtoPDF может отображать диаграммы javascript? Результат тоже интерактивен? - person Stefan Steiger; 20.08.2011

Единственный способ сделать это - создать изображение в коде и поместить это изображение в столбец заголовка.

Если вы используете SQL Server Reporting Services 2008 R2, вам не нужно создавать изображение: выберите текстовое поле и установите следующие свойства:

TextAlign: Left
VerticalAlign: Middle
WritingMode: Rotate 270

Четкий чистый текст со стилями.

person Jamie F    schedule 17.08.2011
comment
Только R2. Черт, я уже пробовал это вчера, и это не сработало. Глядя на ваш текстовый ответ, который, кстати, неверен, я понял, что не учел, что поворот на 270 ° смешивает значение вертикального и горизонтального выравнивания, что, по-видимому, является неустойчивым поведением ... Кстати: это TextAlign: Right + VerticalAlign middle + WritingMode: Rotate 270 ... Очевидно, что значение этих заголовков относится к горизонтальной ячейке при вращении 0. - person Stefan Steiger; 17.08.2011
comment
Кстати, это не отвечает на исходный вопрос, который все еще актуален, потому что у нас есть некоторые серверы, на которых у нас все еще есть SSRS 2005. - person Stefan Steiger; 17.08.2011
comment
Я почти уверен, что вам нужен TextAlign: Left, чтобы получить то, что вы указали на своем скриншоте. Я отредактировал свой ответ, чтобы удалить ссылку 2008 года, и изменил центр на средний. - person Jamie F; 17.08.2011
comment
И .: Хм, правильно, если я воссоздаю отчет в 2008 R2, то это TextAlign: слева. Если я использую старый отчет, преобразованный из 2005 года, то это правильно. Похоже, это вызвано ошибкой преобразования из версии 2005 года. Вероятно, искажается старое свойство text-direction, которое я изменил в SSRS2005. - person Stefan Steiger; 20.08.2011

Единственный способ сделать это - создать изображение в коде и поместить его в столбец заголовка.

Если вы визуализируете это в браузере, это неправда, что изображение - единственный выход. Вы можете повернуть текст с помощью CSS, и это отлично выглядит в хороших браузерах, и сносно в IE ‹9.

Конечно, вы упомянули PDF, и в этом случае уловки CSS явно не применимы. Из вопроса просто неясно, во что именно встроено это изображение, которое вы создаете.

person Joel Mueller    schedule 16.08.2011
comment
Это строка заголовка отчета SSRS, и отчеты SSRS могут быть преобразованы в HTML, PDF, XLS, CSV и т. Д., Включая возможность написания пользовательских расширений рендеринга. - person Stefan Steiger; 17.08.2011