我使用以下代码克隆位图图像而不锁定原始文件。但我面临的问题是克隆图像(.Gif)与原始图像不同。特别是,克隆图像的颜色不合适。
我做错了吗?有没有更好的方法让内存中的Image和原始文件从硬盘中删除?
代码:
private Bitmap CloneImage(Bitmap src)
{
if (src == null)
return src;
Bitmap bitmap = new Bitmap(src.Size.Width, src.Size.Height, src.PixelFormat);
System.Drawing.Rectangle bounds = new System.Drawing.Rectangle(0, 0, src.Width, src.Height);
System.Drawing.Imaging.BitmapData bmpData = src.LockBits(bounds, System.Drawing.Imaging.ImageLockMode.ReadWrite, src.PixelFormat);
System.Drawing.Imaging.BitmapData newBmpData = bitmap.LockBits(bounds, System.Drawing.Imaging.ImageLockMode.ReadWrite, src.PixelFormat);
IntPtr bPtr = bmpData.Scan0;
IntPtr nbPtr = newBmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * src.Height;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(bPtr, rgbValues, 0, bytes);
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, nbPtr, bytes);
bitmap.UnlockBits(newBmpData);
src.UnlockBits(bmpData);
return bitmap;
}
原始图片:
克隆图片:
答案 0 :(得分:3)
这看起来像调色板问题。单个像素位于正确的位置,因此memcpy代码可能是正确的。
要么复制调色板,要么使用24或32位像素格式,并使用Graphics.FromImage
将源图像blit到目标位图上。然后你可以保存为PNG,无论如何它可能是一个较小的文件。
答案 1 :(得分:1)
通过将图像保存到MemoryStream来克隆图像更容易(更少代码)。然后你可以从MemoryStream加载它,你将获得克隆的位图,你不必混淆像素格式。
答案 2 :(得分:0)
根据这个SO answer,你在这里所做的应该和
一样难private Bitmap CloneImage(Bitmap src)
{
return new Bitmap(src);
}