Jag har gjort en hel applikation för att ladda upp bilder till en websida i ASP.NET/C#. några frågor: Jag har gjort liknande tidigare och det hela bygger på i stort sett fyra saker:Transparenta giffar
Förutom att automatiskt storleksanpassa bilden så kan den ex. spara om TIF-filer till JPG m.m.
Problemet är just nu att det inte funkar för transparenta gif-filer. Bakgrundsfärgen blir svart.
Jag har försökt att läsa på webben om detta och det verkar inte helt enkelt. Någon som har ett enkelt tips?
En tanke var att man skulle kunna ta reda på vilken färg i paletten som är genomskinlig och sedan sätta den just innan man sparar bilden.
Bifogar Resize-funktionen. Det verkar vara där som den uppladdade bilden tappar sin genomskinlighet.
Tack på förhand
/Mikael
------------------------------------------
Bitmap ResizeImage(Stream stmInput, int inputMaxWidth, int inputMaxHeight){
float tmpHeight;
float tmpWidth;
Bitmap bmInput = new Bitmap(stmInput, true);
tmpHeight = bmInput.Height;
tmpWidth = bmInput.Width;
bmInput.Dispose();
if (tmpWidth > inputMaxWidth) {
float scaleX = inputMaxWidth / tmpWidth;
tmpWidth = tmpWidth * scaleX;
tmpHeight = tmpHeight * scaleX;
}
if (tmpHeight > inputMaxHeight) {
float scaleY = inputMaxHeight / tmpHeight;
tmpWidth = tmpWidth * scaleY;
tmpHeight = tmpHeight * scaleY;
}
picWidth = Convert.ToInt32(tmpWidth);
picHeight = Convert.ToInt32(tmpHeight);
int Quality = 100;
System.Drawing.Image image = System.Drawing.Image.FromStream(stmInput);
Bitmap bmp = new Bitmap(picWidth, picHeight);
bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
Graphics gr = Graphics.FromImage(bmp);
gr.FillRectangle(new SolidBrush(Color.Transparent), 0, 0, picWidth, picHeight);
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
gr.DrawImage(image, 0, 0, picWidth, picHeight);
gr.Save();
EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Quality);
return bmp;
image.Dispose();
bmp.Dispose();
}Sv: Transparenta giffar
EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Quality);
var när o hur blir den koden inblandad?
och:
return bmp;
image.Dispose();
bmp.Dispose();
den koden kommer inte att köras eftersom det ligger efter return... dessutom vill du inte disposa "bmp" eftersom du ska returnera den till någon...
det är lite som ett precis innan du ger någon en present så slår du sönder den med en hammare :)
(fast i det här fallet spelar det ingen roll eftersom den koden inte körs alls)Sv: Transparenta giffar
1. Ursprungsbilden skall ha en alpha-kanal.
2. Målbilden skall ha en alpha-kanal.
3. Rita med DrawImage med InterpolationMode satt till HighQualityBicubic
4. Det man sedan gör med bilden skall kunna hantera en alpha-kanal.
1. Är förmodligen OK eftersom du skapar den via FromStream som då läser upp den som en transparent Image.
2. Är förmodligen också OK eftersom konstruktorn Bitmap(width, height) skapar en bitmap med Alpha-kanal.
3. Är också OK.
4. Vet jag inget om eftersom den koden inte visas. Sparar du bilden som jpeg (big nono eftersom jpeg inte stödjer transparens) eller ritar du den eller vad gör du med den?
Jag skulle gissa på punkt 4, men jag kan mycket väl ha missat någon detalj.
Du kan ävan kika på en konversation där de verkar ha fått det att fungera på http://www.dotnet247.com/247reference/msgs/45/229348.aspx.
/Andreas