Ho preso dalla rete una procedura in c# che serve a rendere trasparente un gif.
Ho provato a tradurlo in vb.netma niente da fare.
Forse quello che è sfuggito a me sarà più chiaro a voi. Confido nel vostro aiuto:
c#
vb.netcodice:public static void MakeTransparentGif(ref Bitmap bmp, Color color) { byte R = color.R; byte G = color.G; byte B = color.B; MemoryStream fin = new MemoryStream(); bmp.Save(fin, System.Drawing.Imaging.ImageFormat.Gif); MemoryStream fout = new MemoryStream((int)fin.Length); int count = 0; byte[] buf = new byte[256]; byte transparentIdx = 0; fin.Seek(0, SeekOrigin.Begin); //header count = fin.Read(buf, 0, 13); if ((buf[0] != 71) || (buf[1] != 73) || (buf[2] != 70)) return; //GIF fout.Write(buf, 0, 13); int i = 0; if ((buf[10] & 0x80) > 0) { i = 1 << ((buf[10] & 7) + 1) == 256 ? 256 : 0; } for (; i != 0; i--) { fin.Read(buf, 0, 3); if ((buf[0] == R) && (buf[1] == G) && (buf[2] == B)) { transparentIdx = (byte)(256 - i); } fout.Write(buf, 0, 3); } bool gcePresent = false; while (true) { fin.Read(buf, 0, 1); fout.Write(buf, 0, 1); if (buf[0] != 0x21) break; fin.Read(buf, 0, 1); fout.Write(buf, 0, 1); gcePresent = (buf[0] == 0xf9); while (true) { fin.Read(buf, 0, 1); fout.Write(buf, 0, 1); if (buf[0] == 0) break; count = buf[0]; if (fin.Read(buf, 0, count) != count) return; if (gcePresent) { if (count == 4) { buf[0] |= 0x01; buf[3] = transparentIdx; } } fout.Write(buf, 0, count); } } while (count > 0) { count = fin.Read(buf, 0, 1); fout.Write(buf, 0, 1); } fin.Close(); fout.Flush(); //return new Bitmap(fout); bmp.Dispose(); bmp = new Bitmap(fout); }
codice:Public Sub MakeTransparentGif(ByRef bmp As Bitmap, ByVal color As Color) Dim R As Byte = color.R Dim G As Byte = color.G Dim B As Byte = color.B Dim fin As New MemoryStream() bmp.Save(fin, System.Drawing.Imaging.ImageFormat.Gif) Dim fout As New MemoryStream(CInt(fin.Length)) Dim count As Integer = 0 Dim buf As Byte() = New Byte(255) {} Dim transparentIdx As Byte = 0 fin.Seek(0, SeekOrigin.Begin) 'header count = fin.Read(buf, 0, 13) If (buf(0) <> 71) OrElse (buf(1) <> 73) OrElse (buf(2) <> 70) Then 'GIF Return End If fout.Write(buf, 0, 13) Dim i As Integer = 0 If (buf(10) And 128) > 0 Then If ((buf(10) And 7) + 1) = 256 Then i = 1 << 256 Else i = 1 << 0 End If End If While i <> 0 fin.Read(buf, 0, 3) If (buf(0) = R) AndAlso (buf(1) = G) AndAlso (buf(2) = B) Then transparentIdx = CByte((256 - i)) End If fout.Write(buf, 0, 3) i -= 1 End While Dim gcePresent As Boolean = False While True fin.Read(buf, 0, 1) fout.Write(buf, 0, 1) If buf(0) <> 33 Then Exit While End If fin.Read(buf, 0, 1) fout.Write(buf, 0, 1) gcePresent = (buf(0) = 249) While True fin.Read(buf, 0, 1) fout.Write(buf, 0, 1) If buf(0) = 0 Then Exit While End If count = buf(0) If fin.Read(buf, 0, count) <> count Then Return End If If gcePresent Then If count = 4 Then buf(0) = 1 buf(3) = transparentIdx End If End If fout.Write(buf, 0, count) End While End While While count > 0 count = fin.Read(buf, 0, 1) fout.Write(buf, 0, 1) End While fin.Close() fout.Flush() 'return new Bitmap(fout); bmp.Dispose() bmp = New Bitmap(fout) End Sub

ma niente da fare.
Rispondi quotando
ho trovato