65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 显示 16 位图像

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (11投票s)

2008 年 12 月 8 日

CPOL

3分钟阅读

viewsIcon

195418

downloadIcon

8108

一篇关于如何使用 GDI+ 方法显示 16 位原始图像的文章。

引言和背景

使用 C# 在屏幕上显示图像非常容易。 您只需要使用 Image.FromFile 方法读取图像,您就可以使用该图像了。 之后,您需要使用 Graphics 方法 DrawImage 来显示它。 这对于不同的图像格式(如 BMP、JPEG、PNG、TIFF 等)以及特别是对于彩色图像(占常见图像的很大一部分)非常有效。 在彩色图像中,每个像素都具有与三个通道(红色、绿色和蓝色)相关联的值。

但是,对于许多科学和专业应用,这些“通用”彩色图像并不适用。 例如,在 X 射线应用中,图像是灰度图像。 在灰度图像中,每个像素的值都是一个代表像素位置强度的单个值。 仅存储该单个灰度值就足够了。 灰度图像的位深度可能为 8、16 或更高。 在 8 位图像中,强度值在 0 - 255 范围内变化,每个像素值存储在一个字节中;而在 16 位图像中,强度值在 0 - 65535 范围内变化,每个像素值存储在两个连续的字节中。 某些应用程序需要 16 位图像表示提供的精度。

原始图像

灰度图像最简单的格式是原始格式,其中图像的原始像素数据从左上到右下存储在文件中。 由于原始文件没有任何标头,因此有必要事先知道宽度、高度和位深度。 在这里,我们介绍一个简单的应用程序来显示以原始格式存储的图像,并具有以下假设:位深度为每像素 16 位,并且图像的宽度和高度相同。

显示图像

显示图像的步骤是

  1. 打开文件并读入像素数据。 使用 BinaryReader 对象,因为这是一个二进制文件。 将像素数据存储在 ArrayListushort 数据类型中。 从文件大小计算图像的宽度和高度。
  2. 创建一个所需大小的 Bitmap 对象,并将原始像素数据从 [0, 65535] 范围缩放到 [0,255] 范围。 这样做是因为显示范围是 0-255。 例如,像素值 30000 将变为 117。 填充创建的 Bitmap 对象的像素。 在这里,有两种可能性
    1. 使用 SetPixel 方法,或
    2. 使用 BitmapDataLockBitsUnlockBits 方法。

    后一种方法需要使用不安全的代码,并且由于它比前一种方法快得多,因此是首选方法。 在此应用程序中使用后一种方法。

  3. 重写 Paint 方法,并使用 DrawImage 显示图像。

在示例应用程序中,使用 Panel 对象来限制屏幕上显示的图像的尺寸。 由于可能难以获得 16 位原始图像,因此附加了一些尺寸为 512 x 512 像素的 16 位原始图像。 此应用程序是使用 Visual Studio 2003 构建的,并且可以在更高版本的 Visual Studio 上轻松打开。 应用程序需要使用 unsafe 标志来构建。

闭包

这完成了显示 16 位图像的小而简单的应用程序。 可以扩展此应用程序以包括读取 8 位和 16 位 TIFF 文件,包括滚动条以浏览图像,使用双缓冲以避免闪烁等等。 还可以使用此基本结构作为起点构建复杂的图像处理应用程序。

© . All rights reserved.