c# - LockBits/UnlockBits 在 C# 中做什么?

标签 c# gdi+ lockbits

我在 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 使用有损算法。那么会发生什么:

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

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

锁定位/解锁位用于允许程序操作内存中的图像数据。不多不少。另请参阅the documentation for those methods .

关于c# - LockBits/UnlockBits 在 C# 中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59842615/

相关文章:

c# - 无法使用 C# 从 XElement 中删除空的 xmlns 属性

c# - 如何在 .NET winforms 中公开 ListView?

c# - 裁剪/删除图像边缘不需要的空间

c# - 图表点和画线

c# - 以这种方式使用锁位复制位图区域是否安全(双关语)?

visual-studio-2012 - Visual Studio 2012 - vshost32-clr2.exe 已停止工作

c++ - Qt 中的锁位。如何实现?

c# - 适用于 Windows 10 (UWP) 的 HTML 解析器

c# - WPF 绑定(bind)未从 DispatcherTimer 更新

c++ - 绘制图像