【发布时间】:2013-10-13 23:29:00
【问题描述】:
我使用下面的代码来克隆位图图像而不锁定原始文件。但我面临克隆图像(.Gif)与原始图像不同的问题。特别是克隆图像的颜色不合适。
我做错了吗?有没有更好的方法让内存中的图像和硬盘中的原始文件删除?
代码:
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;
}
原图:
克隆图像:
【问题讨论】:
-
运行时的
src.PixelFormat是什么?步幅值是多少?这看起来像一个托盘问题。各个像素位于正确的位置,因此 memcpy 代码可能是正确的。 -
我猜 PixelFormat 是 Format8bppIndexed 并且生成的图像具有正确的像素信息,只是一个错误/错误的颜色表。
-
你试过
Bitmap result = new Bitmap(source);吗? -
感谢您的 cmets。 src.pixelformat 是 Format8bppIndexed stride = 240.. 如果颜色表或调色板有误,请建议我解决这个问题?
-
@Rotem :是的,我已经尝试过了。但我不能使用该构造函数,因为我需要删除原始文件。如果我使用它,那么在删除原始图像时会导致锁定问题。