首页 > 解决方案 > LockBits/UnlockBits 在 C# 中有什么作用?

问题描述

我在 c# 中有一个方法,它唯一做的是 LockBits,然后是 UnlockBits,并且图像(输入/输出,转换为字节数组)是不同的。来自输出的字节比来自输入的字节少 100 个字节。这只发生在 .jpg 文件中。检查 HxD 中的文件后,我了解到它删除了标题的一部分,确切地说是 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;
}

标签: c#gdi+lockbits

解决方案


调用Bitmap.LockBits()后跟Bitmap.UnlockBits()什么都不做。

您观察到的行为是因为加载了 JPEG 图像,然后再次保存。JPEG 使用有损算法。那么会发生什么:

  1. 您从磁盘加载 JPEG
  2. JPEG 数据被解码为带有颜色信息的单个像素,即位图
  3. 您再次以 JPEG 格式保存位图,生成的文件与 #1 不同

这样做还可能会丢失 JPEG 文件中存在的元数据。所以是的,文件不同并且可能更小,因为每次执行此操作时,都会丢失一些像素数据或元数据。

Lockbits/Unlockbits 用于允许程序操作内存中的图像数据。不多也不少。另请参阅这些方法的文档


推荐阅读