c# - 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;
}
解决方案
调用Bitmap.LockBits()
后跟Bitmap.UnlockBits()
什么都不做。
您观察到的行为是因为加载了 JPEG 图像,然后再次保存。JPEG 使用有损算法。那么会发生什么:
- 您从磁盘加载 JPEG
- JPEG 数据被解码为带有颜色信息的单个像素,即位图
- 您再次以 JPEG 格式保存位图,生成的文件与 #1 不同
这样做还可能会丢失 JPEG 文件中存在的元数据。所以是的,文件不同并且可能更小,因为每次执行此操作时,都会丢失一些像素数据或元数据。
Lockbits/Unlockbits 用于允许程序操作内存中的图像数据。不多也不少。另请参阅这些方法的文档。
推荐阅读
- django - 在 Django REST 中使用 API,服务器端,并在 Angular 中为客户端提供服务
- jenkins - 尽管步骤失败,Jenkinsfile 阶段没有失败
- ios - 如何在 iOS 中解码 AES-128 数据
- c - 从包含 int 和 char 的输入字符串中提取单个 char 和单个 int?
- java - 用于单个事件或超时事件的 RxJava 运算符
- python - 如何在 matplotlib 中显示笛卡尔坐标轴?
- r - 在 R 的列表中过滤 TRUE/FALSE 的函数
- sql - 我想要一个查询来从 SQL Server 中提取表数据
- c++ - c++计算科目成绩
- azure - Azure Blob 存储在创建新容器时引发异常。声称它已经存在,但它不存在