开发者

C#/VB.NET: Howto improve anti-alias quality

Question:

In Reporting Service, I need to have a vertical, starting at bottom, bottom-to-top, horizontally middle aligned text.

The only way to do this is to create an image in code, and set this image into the title column.

See the code below.

Basically, it works fine, just that the anti-alias quality is pretty crappy.

Is there anything I can do to improve it ?

See below screenshot:

C#/VB.NET: Howto improve anti-alias quality

The vertical text is somehow pale, and not full black,

and also there is smearing all around the text, in the background color. As well as it appears bolder than the text on the left, but both have format arial, size 8, bold

I've tried all other values of

System.Drawing.Text.TextRenderingHint.* , as well as no anti-alias at all

but the current one seems to be the least crappy. I've also tried to change the image format, to no avail:

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


I was having this problem, but only in certain browsers. I think its a browser issue (IE). Firefox and Chrome seemed to be ok.

In the end I decided to manually build my reports in html and used HighCharts for the graphics. I then rendered it all out to PDF using wkHTMLtoPDF

Its come together quite well and the anti alias issues have gone. I think you might be stuck with these problems in SQL Reporting Services.


The only way to do this is to create an image in code, and set this image into the title column.

If you are using SQL Server Reporting Services 2008 R2 you do not need to create an image: Select the text box and set the following properties:

TextAlign: Left
VerticalAlign: Middle
WritingMode: Rotate 270

Crisp clean text, rendered with styles.


The only way to do this is to create an image in code, and set this image into the title column.

If you're rendering this in a browser, it's not true that an image is the only way to go. You can rotate the text with CSS, and it looks great in good browsers, and passable in IE < 9.

Of course, you mentioned PDF, in which case CSS tricks obviously wouldn't apply. It's just not clear from the question exactly what this image you're generating is being embedded into.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜