Возможно для вас вопрос покажется простым, но я не знаю в чем дело...
Создан класс, в котором имеется объект System.Graphics.Bitmap
Естесственно ихображение в него уже загружено, и применяя SetTransparency(Color.Black)
я хочу получить прозрачный цвет на месте черного. Ожидаю увидеть в этом месте рисунок, который находится под ним,
но вместо этого я вижу серенький цвет самой формы.... В чем дело?
Попробуй так
у меня это работает
MemoryStream MakeTransparent(MemoryStream origBitmapMemoryStream)
{
Color transparentColor = GetColor("White");
int transparentArgb = transparentColor.ToArgb();
using (Bitmap origBitmap = new Bitmap(origBitmapMemoryStream))
{
using (Bitmap newBitmap = new Bitmap(origBitmap.Width, origBitmap.Height, origBitmap.PixelFormat))
{
ColorPalette origPalette = origBitmap.Palette;
ColorPalette newPalette = newBitmap.Palette;
int index = 0;
int transparentIndex = -1;
foreach (Color origColor in origPalette.Entries)
{
newPalette.Entries[index] = Color.FromArgb(255, origColor);
if (origColor.ToArgb() == transparentArgb) transparentIndex = index;
index += 1;
}
if (-1 == transparentIndex)
{
return origBitmapMemoryStream;
}
newPalette.Entries[transparentIndex] = Color.FromArgb(0, transparentColor);
newBitmap.Palette = newPalette;
Rectangle rect = new Rectangle(0, 0, origBitmap.Width, origBitmap.Height);
BitmapData origBitmapData = origBitmap.LockBits(rect, ImageLockMode.ReadOnly, origBitmap.PixelFormat);
BitmapData newBitmapData = newBitmap.LockBits(rect, ImageLockMode.WriteOnly, newBitmap.PixelFormat);
for (int y = 0; y < origBitmap.Height; y++)
{
for (int x = 0; x < origBitmap.Width; x++)
{
byte origBitmapByte = Marshal.ReadByte(origBitmapData.Scan0, origBitmapData.Stride * y + x);
Marshal.WriteByte(newBitmapData.Scan0, newBitmapData.Stride * y + x, origBitmapByte);
}
}
newBitmap.UnlockBits(newBitmapData);
origBitmap.UnlockBits(origBitmapData);
MemoryStream m = new MemoryStream();
newBitmap.Save(m, ImageFormat.Gif);
return m;
}
}
}
enum RgbPart { RgbPartRed, RgbPathGreen, RgbPartBlue };
Color GetColor(string color)
{
if (color.StartsWith("#"))
{
return Color.FromArgb(IntFromHexRgbPart(color, RgbPart.RgbPartRed),
IntFromHexRgbPart(color, RgbPart.RgbPathGreen),
IntFromHexRgbPart(color, RgbPart.RgbPartBlue)
);
}
return Color.FromName(color);
}
int IntFromHexRgbPart(string hexRgb, RgbPart part)
{
if ((null == hexRgb) || (hexRgb.Length == 0) || (!(hexRgb.StartsWith("#"))))
return 0;
try
{
switch (part)
{
case RgbPart.RgbPartRed:
if (hexRgb.Length < 3) return 0;
return IntFromHex(hexRgb.Substring(1, 2));
case RgbPart.RgbPathGreen:
if (hexRgb.Length < 5) return 0;
return IntFromHex(hexRgb.Substring(3, 2));
case RgbPart.RgbPartBlue:
if (hexRgb.Length < 7) return 0;
return IntFromHex(hexRgb.Substring(5, 2));
default:
return 0;
}
}
catch { return 0; }
}
int IntFromHex(string hex)
{
return (int) byte.Parse(hex, System.Globalization.NumberStyles.HexNumber);
}
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение