使用 C# 显示 16 位图像






4.71/5 (11投票s)
一篇关于如何使用 GDI+ 方法显示 16 位原始图像的文章。
引言和背景
使用 C# 在屏幕上显示图像非常容易。 您只需要使用 Image.FromFile
方法读取图像,您就可以使用该图像了。 之后,您需要使用 Graphics
方法 DrawImage
来显示它。 这对于不同的图像格式(如 BMP、JPEG、PNG、TIFF 等)以及特别是对于彩色图像(占常见图像的很大一部分)非常有效。 在彩色图像中,每个像素都具有与三个通道(红色、绿色和蓝色)相关联的值。
但是,对于许多科学和专业应用,这些“通用”彩色图像并不适用。 例如,在 X 射线应用中,图像是灰度图像。 在灰度图像中,每个像素的值都是一个代表像素位置强度的单个值。 仅存储该单个灰度值就足够了。 灰度图像的位深度可能为 8、16 或更高。 在 8 位图像中,强度值在 0 - 255 范围内变化,每个像素值存储在一个字节中;而在 16 位图像中,强度值在 0 - 65535 范围内变化,每个像素值存储在两个连续的字节中。 某些应用程序需要 16 位图像表示提供的精度。
原始图像
灰度图像最简单的格式是原始格式,其中图像的原始像素数据从左上到右下存储在文件中。 由于原始文件没有任何标头,因此有必要事先知道宽度、高度和位深度。 在这里,我们介绍一个简单的应用程序来显示以原始格式存储的图像,并具有以下假设:位深度为每像素 16 位,并且图像的宽度和高度相同。
显示图像
显示图像的步骤是
- 打开文件并读入像素数据。 使用
BinaryReader
对象,因为这是一个二进制文件。 将像素数据存储在ArrayList
的ushort
数据类型中。 从文件大小计算图像的宽度和高度。 - 创建一个所需大小的
Bitmap
对象,并将原始像素数据从 [0, 65535] 范围缩放到 [0,255] 范围。 这样做是因为显示范围是 0-255。 例如,像素值 30000 将变为 117。 填充创建的Bitmap
对象的像素。 在这里,有两种可能性 - 使用
SetPixel
方法,或 - 使用
BitmapData
和LockBits
和UnlockBits
方法。 - 重写
Paint
方法,并使用DrawImage
显示图像。
后一种方法需要使用不安全的代码,并且由于它比前一种方法快得多,因此是首选方法。 在此应用程序中使用后一种方法。
在示例应用程序中,使用 Panel
对象来限制屏幕上显示的图像的尺寸。 由于可能难以获得 16 位原始图像,因此附加了一些尺寸为 512 x 512 像素的 16 位原始图像。 此应用程序是使用 Visual Studio 2003 构建的,并且可以在更高版本的 Visual Studio 上轻松打开。 应用程序需要使用 unsafe 标志来构建。
闭包
这完成了显示 16 位图像的小而简单的应用程序。 可以扩展此应用程序以包括读取 8 位和 16 位 TIFF 文件,包括滚动条以浏览图像,使用双缓冲以避免闪烁等等。 还可以使用此基本结构作为起点构建复杂的图像处理应用程序。