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: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 allbut 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.
精彩评论