Pergunta

Eu estou tentando retornar um GIF transparente de uma página .aspx para exibição dentro de uma página web. Eu estou tentando obter a imagem ter transparência, mas eu continuo recebendo ser negro onde a imagem deve ser transparente.

Alguém sabe o que estou fazendo de errado?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Me.Load
    '' Change the response headers to output a GIF image.
    Response.Clear()
    Response.ContentType = "image/gif"

    Dim width = 110
    Dim height = width

    '' Create a new 32-bit bitmap image
    Dim b = New Bitmap(width, height)

    '' Create Grahpics object for drawing
    Dim g = Graphics.FromImage(b)

    Dim rect = New Rectangle(0, 0, width - 1, height - 1)

    '' Fill in with Transparent
    Dim tbrush = New System.Drawing.SolidBrush(Color.Transparent)
    g.FillRectangle(tbrush, rect)

    '' Draw Circle Border
    Dim bPen = Pens.Red
    g.DrawPie(bPen, rect, 0, 365)

    '' Fill in Circle
    Dim cbrush = New SolidBrush(Color.LightBlue)
    g.FillPie(cbrush, rect, 0, 365)


    '' Clean up
    g.Flush()
    g.Dispose()

    '' Make Transparent
    b.MakeTransparent()

    b.Save(Response.OutputStream, Imaging.ImageFormat.Gif)
    Response.Flush()
    Response.End()
End Sub
Foi útil?

Solução

Infelizmente, não há nenhuma maneira fácil de criar um GIF transparente usando um objeto Bitmap. (Veja este artigo KB )

Você também pode usar o formato PNG que a transparência suportes com o código que você está usando.

Outras dicas

Sim, como Jerome afirmado, não há qualquer maneira para criar transparente GIF do uso de um objeto Bitmap. Porcaria!

Bem, de qualquer maneira, eu mudei meu código para gerar um PNG e todos os trabalhos como esperado.

Não é um trabalho pequeno ao redor Eu tinha necessidade de fazer desde que você não pode escrever PNG diretamente para o OutputStream. Eu precisava para escrever o PNG para um MemoryStream e, em seguida, escrever que para o OutputStream.

Aqui está o código final para minha implementação:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Me.Load
    '' Change the response headers to output a JPEG image.
    Response.Clear()
    Response.ContentType = "image/png"

    Dim width = 11
    Dim height = width

    '' Create a new 32-bit bitmap image
    Dim b = New Bitmap(width, height)

    '' Create Grahpics object for drawing
    Dim g = Graphics.FromImage(b)

    '' Fill the image with a color to be made Transparent after drawing is finished.
    g.Clear(Color.Gray)

    '' Get rectangle where the Circle will be drawn
    Dim rect = New Rectangle(0, 0, width - 1, height - 1)

    '' Draw Circle Border
    Dim bPen = Pens.Black
    g.DrawPie(bPen, rect, 0, 365)

    '' Fill in Circle
    Dim cbrush = New SolidBrush(Color.Red)
    g.FillPie(cbrush, rect, 0, 365)

    '' Clean up
    g.Flush()
    g.Dispose()

    '' Make Transparent
    b.MakeTransparent(Color.Gray)

    '' Write PNG to Memory Stream then write to OutputStream
    Dim ms = New MemoryStream()
    b.Save(ms, Imaging.ImageFormat.Png)
    ms.WriteTo(Response.OutputStream)

    Response.Flush()
    Response.End()
End Sub

É possível , mas não é fácil
Se você é capaz de usar o código inseguro em seu projeto, existem alguns métodos para usar ponteiros para rasgar através da tabela de cor e fazer o trabalho transparência.

Um aplicativo de formulários de exemplo por Bob Powell está disponível aqui http://www.bobpowell.net/giftransparency htm . Eu usei uma variação sobre esse método em um manipulador de web há alguns anos atrás que estava ficando hit cerca de 10 milhões de vezes por mês, e pareceu funcionar bem.

Se você estiver usando apenas uma cor limitada pallete você pode reduzir o processamento de tabela de cores para apenas as cores que você precisa (não me lembro exatamente como eu fiz isso ...).

Dito isto, png é um crapload métrica mais fácil.

aqui é algum código para ter um gif (que já tem transparência nele) transformada (suposto você quiser redimensioná-la) em bitmap e, em seguida, pode ser mostrado corretamente com a sua transparência.

imagePath = System.Web.HttpContext.Current.Request.MapPath(libraryPath + reqImageFile);
System.Drawing.Image image = null;
Bitmap resizedImage = null;

if (reqWidth == 0) { reqWidth = image.Width; }
if (reqHeight == 0) { reqHeight = image.Height; }
image = System.Drawing.Image.FromFile(imagePath);
reqWidth = image.Width;
reqHeight = image.Height;

//here is the transparency 'special' treatment
resizedImage = new Bitmap(reqWidth, reqHeight, PixelFormat.Format8bppIndexed);
ColorPalette pal = resizedImage.Palette;
for (int i = 0; i < pal.Entries.Length; i++)
{
       Color col = pal.Entries[i];
       pal.Entries[i] = Color.FromArgb(0, col.R, col.G, col.B);
}
resizedImage.Palette = pal;
BitmapData src = ((Bitmap)image).LockBits(new Rectangle(0, 0, reqWidth, reqHeight),  ImageLockMode.ReadOnly, image.PixelFormat);
BitmapData dst = resizedImage.LockBits(new Rectangle(0, 0, resizedImage.Width, resizedImage.Height),
ImageLockMode.WriteOnly, resizedImage.PixelFormat);
((Bitmap)image).UnlockBits(src);
resizedImage.UnlockBits(dst);

Boa sorte!

Grégoire Lafortune

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top