Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    traduzione da c# a vb.net

    Ho preso dalla rete una procedura in c# che serve a rendere trasparente un gif.
    Ho provato a tradurlo in vb.net ma niente da fare.
    Forse quello che è sfuggito a me sarà più chiaro a voi. Confido nel vostro aiuto:

    c#
    codice:
    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);
    
    }
    vb.net
    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
    Pietro

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa ... ma "niente da fare" cosa vuol dire ? Se hai un errore, indicalo e dicci la riga ... perche' lasciate tutto il da farsi "agli altri" ?

    Probabilmente chi vorrebbe darti una mano, rinunziera' se dovra' partire da zero ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da oregon
    Scusa ... ma "niente da fare" cosa vuol dire ? Se hai un errore, indicalo e dicci la riga ... perche' lasciate tutto il da farsi "agli altri" ?

    Probabilmente chi vorrebbe darti una mano, rinunziera' se dovra' partire da zero ...
    Dunque, basta prendere una piccola gif, un rettangolo rosso su sfondo nero, per esempio.
    La versione c# riesce a creare una gif con lo sfondo trasparente; quella in vb.net, no.

    Non so dove sia l'errore, purtroppo.
    Pietro

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    ho trovato

    questo c#
    i = 1 << ((buf[10] & 7) + 1) == 256 ? 256 : 0;

    non va tradotto così
    If ((buf(10) And 7) + 1) = 256 Then
    i = 1 << 256
    Else
    i = 1 << 0
    End If

    ma così
    i = SE(((CInt(1) << ((buf(10) And 7) + 1)) = &H100), &H100, 0)

    dove se è:
    Public Function SE(Of T)(ByVal expression As Boolean, ByVal valueOnTrue As T, ByVal valueOnFalse As T) As T
    If expression Then
    Return valueOnTrue
    Else
    Return valueOnFalse
    End If
    End Function
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.