У меня есть страница с несколькими браузерами, которая показывает вертикальный текст.
В качестве уродливого хакера для получения текста, отображаемого вертикально во всех браузерах, я создал собственный обработчик страниц, который возвращает PNG с текстом, нарисованным вертикально.
Вот мой основной код (C # 3, но небольшие изменения в любой другой версии вплоть до 1):
Font f = GetSystemConfiguredFont();
//this sets the text to be rotated 90deg clockwise (i.e. down)
StringFormat stringFormat = new StringFormat { FormatFlags = StringFormatFlags.DirectionVertical };
SizeF size;
// creates 1Kx1K image buffer and uses it to find out how bit the image needs to be to fit the text
using ( Image imageg = (Image) new Bitmap( 1000, 1000 ) )
size = Graphics.FromImage( imageg ).
MeasureString( text, f, 25, stringFormat );
using ( Bitmap image = new Bitmap( (int) size.Width, (int) size.Height ) )
{
Graphics g = Graphics.FromImage( (Image) image );
g.FillRectangle( Brushes.White, 0f, 0f, image.Width, image.Height );
g.TranslateTransform( image.Width, image.Height );
g.RotateTransform( 180.0F ); //note that we need the rotation as the default is down
// draw text
g.DrawString( text, f, Brushes.Black, 0f, 0f, stringFormat );
//make be background transparent - this will be an index (rather than an alpha) transparency
image.MakeTransparent( Color.White );
//note that this image has to be a PNG, as GDI+'s gif handling renders any transparency as black.
context.Response.AddHeader( "ContentType", "image/png" );
using ( MemoryStream memStream = new MemoryStream() )
{
image.Save( memStream, ImageFormat.Png );
memStream.WriteTo( context.Response.OutputStream );
}
}
Это создает изображение, которое выглядит так, как я хочу, за исключением того, что прозрачность основана на индексах. Поскольку я возвращаю PNG, он может поддерживать правильную альфа-прозрачность.
Есть ли способ сделать это в .net?
Благодаря Vlix (см. Комментарии) я внес некоторые изменения, хотя они все еще не правы:
using ( Bitmap image = new Bitmap( (int) size.Width, (int) size.Height, PixelFormat.Format32bppArgb ) )
{
Graphics g = Graphics.FromImage( (Image) image );
g.TranslateTransform( image.Width, image.Height );
g.RotateTransform( 180.0F ); //note that we need the rotation as the default is down
// draw text
g.DrawString( text, f, Brushes.Black, 0f, 0f, stringFormat );
//note that this image has to be a PNG, as GDI+'s gif handling renders any transparency as black.
context.Response.AddHeader( "ContentType", "image/png" );
using ( MemoryStream memStream = new MemoryStream() )
{
//note that context.Response.OutputStream doesn't support the Save, but does support WriteTo
image.Save( memStream, ImageFormat.Png );
memStream.WriteTo( context.Response.OutputStream );
}
}
Теперь кажется, что альфа работает, но текст кажется блочным - как будто у него все еще есть края jaggie, но на черном фоне.
Это какая-то ошибка в .Net / GDI +? Я уже обнаружил, что он не работает даже с индексной прозрачностью для гифок, поэтому я не очень уверен в этом.
Это изображение показывает два пути, которые идут не так:

Верхнее изображение показывает его без белого фона или MakeTransparent
вызова. Вторая с белым фоном и затем MakeTransparent
вызывается для добавления прозрачности индекса.
Ничего из этого не является правильным - на втором изображении присутствуют неровности с алиасами белого цвета, которые мне не нужны, на первом изображается сплошной псевдоним с черным.