visual transparente studio poner paneles hacer c# .net gdi+

studio - ¿Puedes hacer un PNG transparente alfa con C#?



paneles en visual basic (9)

Tengo una página de múltiples navegadores que muestra texto vertical.

Como un feo truco para hacer que el texto se visualice verticalmente en todos los navegadores, he creado un controlador de página personalizado que devuelve un PNG con el texto dibujado verticalmente.

Aquí está mi código básico (C # 3, pero pequeños cambios a cualquier otra versión hasta 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 ); } }

Esto crea una imagen que se ve como yo quiero, excepto que la transparencia está basada en un índice. Como devolveré un archivo PNG, podría admitir una transparencia alfa adecuada.

¿Hay alguna manera de hacer esto en .net?

Gracias a Vlix (ver comentarios) hice algunos cambios, aunque todavía no está bien:

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 ); } }

Ahora parece que el alfa funciona, pero el texto parece en bloque, como si todavía tuviera los bordes de jaggie pero contra un fondo negro.

¿Es esto algún error con .Net / GDI +? Ya he descubierto que no funciona para las transparencias de índice, incluso para los gifs, por lo que no tengo mucha confianza en ello.

Esta imagen muestra las dos formas en que esto va mal:

La imagen superior muestra sin fondo blanco o llamada MakeTransparent . El segundo con el fondo lleno de blanco y luego llamado MakeTransparent para agregar la transparencia del índice.

Ninguno de estos es correcto: la segunda imagen tiene jaggies de alias blancos que no quiero, la primera parece tener un alias sólido contra negro.


Al menos debe especificar un formato de píxeles de 32 bits (por ejemplo, PixelFormat.Format32bppArgb) al crear su mapa de bits; de lo contrario, GDI + no podrá gestionar la transparencia.

Para sintonizar el archivo resultante al guardarlo, puede usar Guardar con ImageCodecInfo y EncoderParameters.


IIRC necesita especificar el PixelFormat en el constructor del mapa de bits.


Para antialiasing de texto, juega con los valores en Graphics.TextRenderingHint. Aconsejo no usar ClearType, porque eso solo se verá bien en los monitores LCD (no CRT) y podría no funcionar debido a la rotación.

PD: es Vilx, no Vlix. :RE



Lo siento, no leí tu pregunta con cuidado.

Sé que he dibujado con éxito texto girado sobre un fondo de color sin ver ninguno de los efectos de alias en los ejemplos. Cuando volví a mirar mi código, me di cuenta de que estaba dibujando el texto girado con una fuente lógica, que está muy bien envuelto en el espacio de nombres Microsoft.WindowsCE.Forms. Esta técnica establece el ángulo de dibujo como una propiedad de la fuente lógica (para que no llame a TranslateTransform ni a RotateTransform).

Fuera del mundo de Windows CE, debes invocar para crear una fuente lógica (nunca lo hice y no pude encontrar un buen ejemplo rápidamente). No sé qué tan bien funcionaría esto, pero estoy seguro de que dibujará texto rotado sin los extraños efectos de alias que está viendo. Creo que esto es un error en GDI + (o algo que no pensaron que alguien realmente usaría).

Un enfoque alternativo que incluso podría tener un mejor rendimiento que la fuente lógica es dibujar el texto normalmente en un fondo rectangular de color (lo suficientemente grande como para contener el texto), luego rotar y copiar el rectángulo en la imagen principal. Graphics.DrawImage no parece poder hacer rotación, pero este efecto es fácil de implementar usando LockBits.


O bien, podría simplemente procesar el texto en un PNG no transparente, pero use un color de fondo (en lugar de blanco) que coincida con el color de fondo de la celda.


Resulta que Microsoft tiene una nueva biblioteca de imágenes dinámicas para la web como parte del contenido de Asp.Net en CodePlex:

http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

Desafortunadamente es un poco demasiado para lo que quiero. Al usar código inseguro, puedo transferir mi propia transparencia alfa, pero eso es demasiado lento dado el uso de este código como parte de una aplicación web de alto uso.

¿Es esto solo un error en la implementación de GDI + .Net de MS?


Para arreglar el "bloqueo" del texto, ¿no puedes hacer ...

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

después de esta línea ...

Graphics g = Graphics.FromImage( (Image) image );


Puede usar el método LockBits en su Bitmap para devolver un objeto BitmapData, y establecer el Alpha para cada píxel usted mismo (también podría usar GetPixel y SetPixel, pero estos métodos son terriblemente lentos). Vea esta respuesta .

Sé que esto funciona con seguridad, porque cuando comencé a usar la técnica estaba configurando el valor alfa en 0, por lo que ninguno de los colores que estaba configurando era visible.

Editar: aquí hay una muestra de un efecto de lente ojo de pez, hecho completamente en .NET (usando LockBits):

texto alternativo http://www.freeimagehosting.net/uploads/21ca8300cc.jpg