我在 C# 中有一个方法,它唯一做的事情是 LockBits,然后是 UnlockBits,并且图像(输入/输出,转换为字节数组)是不同的。输出的字节数比输入的字节数少 100 字节。这种情况仅发生在 .jpg 文件中。检查 HxD 中的文件后,我了解到它删除了 header 的一部分,确切地说是 exif 签名。但我不知道如何以及为什么。
有人知道这是做什么的吗?
代码如下:
public Image Validate (image){
BitmapData original = null;
Bitmap originalBMP = null;
try{
originalBMP = image as Bitmap;
original = originalBMP.LockBits(new Rectangle(0, 0,
originalBMP.Width, originalBMP.Height),
ImageLockMode.ReadWrite,
originalBMP.PixelFormat);
originalBMP.UnlockBits(original);
}catch{}
return image;
}
最佳答案
调用 Bitmap.LockBits()
,然后调用 Bitmap.UnlockBits()
不会执行任何操作。
您观察到的行为是由于加载 JPEG 图像然后再次保存所致。 JPEG 使用有损算法。那么会发生什么:
- 您从磁盘加载 JPEG
- JPEG 数据被解码为带有颜色信息的各个像素,即位图
- 您再次以 JPEG 格式保存位图,生成的文件与 #1 不同
这样做还可能会丢失 JPEG 文件中存在的元数据。所以是的,文件是不同的,而且可能更小,因为每次执行此操作时,您都会丢失一些像素数据或元数据。
锁定位/解锁位用于允许程序操作内存中的图像数据。不多不少。另请参阅the documentation for those methods .
关于c# - LockBits/UnlockBits 在 C# 中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59842615/