C# 如何在c语言中读取和修改图像的颜色空间#

C# 如何在c语言中读取和修改图像的颜色空间#,c#,graphics,rgb,color-space,C#,Graphics,Rgb,Color Space,我正在从jpg文件加载位图。如果图像不是24位RGB,我想转换它。转换应该相当快。我加载的图像最大为巨大(9000*9000像素,压缩大小为40-50MB)。如何做到这一点 顺便说一句:如果可能的话,我不想使用任何外部库。但是,如果您知道一个开源实用程序类执行最常见的成像任务,我很高兴听到这个消息。提前谢谢。这不是我自己尝试过的,但我认为您可能需要访问图片的EXIF信息作为开始 查看Scott Hanselman的博客条目。Standard.NETSystem.Drawing名称空间应该包含您需

我正在从jpg文件加载位图。如果图像不是24位RGB,我想转换它。转换应该相当快。我加载的图像最大为巨大(9000*9000像素,压缩大小为40-50MB)。如何做到这一点


顺便说一句:如果可能的话,我不想使用任何外部库。但是,如果您知道一个开源实用程序类执行最常见的成像任务,我很高兴听到这个消息。提前谢谢。

这不是我自己尝试过的,但我认为您可能需要访问图片的EXIF信息作为开始


查看Scott Hanselman的博客条目。

Standard.NET
System.Drawing
名称空间应该包含您需要的所有内容,
但它可能不会很有效率。它会将整个内容加载到RAM中,解压缩,转换(可能是通过复制),然后重新压缩并保存。如果您的目标是高性能,恐怕您可能需要研究C/C++库并为它们制作.NET包装器。

据我所知,jpg总是24 bpp。唯一可以改变的是它是CMY(K?),而不是RGB。该信息将存储在标题中。不幸的是,我没有任何创建CMYK图像的方法来测试加载到位图中是否会自动转换它

以下行将文件读入内存:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat
将告诉您图像格式。但是,除了24bpp RGB JPG之外,我无法测试文件加载对其他文件的作用。我只能建议您尝试一下。

jpeg应该以0xFF 0xD8开头。之后,您将发现以下格式的各种字段:

  • 字段标识符2字节
  • 字段长度,不包括字段标识符。2字节
  • 可变数据

  • 解析字段。您要查找的标识符是0xFF 0xC0。这称为SOF0,包含高度、宽度、位深度等。0xFF 0xC0后面将跟两个字节作为字段长度。紧随其后的是显示位深度的单个字节,通常为8。然后将有两个字节表示高度,两个字节表示宽度,一个字节表示组件数量;这通常是1(灰度)或3。(对于颜色)

    Exif数据只是与图像关联的普通可选元数据。修改Exif数据不会改变图像上的任何内容。但无论如何,谢谢你的回答。我相信,jpg可以有24位和8位深度,这是一个灰度图像。啊-我不记得8位深度,但我应该这样做,因为我必须在以前的工作中处理各种格式的纹理图像。不过,从文件加载的位图不会为您进行转换吗?我不知道如何测试它是否为24位;)我希望在我的问题中含蓄地问这个问题:如何检测图像是否为24位?