gpt4 book ai didi

c# - 在 WPF 中创建 16 位+ 灰度图像

转载 作者:行者123 更新时间:2023-12-04 05:55:12 26 4
gpt4 key购买 nike

我想从我的 WPF 程序中的数据值创建一个 16 位灰度图像。目前我一直在考虑使用带有 PixelFormats.Gray16 集的 WriteableBitmap。

但是我无法让它工作,并且 Microsoft 页面 (http://msdn.microsoft.com/en-us/magazine/cc534995.aspx) 将 Gray16 格式列为不可通过 WriteableBitmap 写入,但不建议如何以这种方式制作一个。

目前我的代码在一个循环中运行,其中 i代表图像高度和j宽度,看起来像这样:

short dataValue = GetDataSamplePixelValue(myDataValue);

//the pixel to fill with this data value:
int pixelOffset = ((i * imageWidth) + j) * bytesPerPixel;

//set the pixel colour values:
pixels[pixelOffset] = dataValue;

我确实得到了一个图像,但它只是一堆垂直的黑白线。如果仅使用 8 位灰度数据(在这种情况下,在上述示例中 short 更改为 byte ),我没有问题。

有谁知道如何使用 WPF 创建每像素 16 位或更高灰度的图像?该图像最终也需要保存。

非常感谢任何建议。

编辑

除此之外,我还进行了一些编辑,现在使用 Gray16 PixelFormat 获得了合理的图像。我很难判断它是否真的是 16 位,因为图像程序的颜色计数给出了 256,我不确定这是因为图像受到 WPF 的限制,或者图像程序确实如此不支持它,因为显然许多图像程序忽略了低 8 位。现在我会坚持我所拥有的。

有关信息,代码如下:
myBitmap = new WriteableBitmap((int)visualRect.Width, (int)visualRect.Height, 96, 96, PixelFormats.Gray16, null);

int bytesPerPixel = myBitmap.Format.BitsPerPixel / 8;
ushort[] pixels = new ushort[(int)myBitmap.PixelWidth * (int)myBitmap.PixelHeight];

//if there is a shift factor, set the background colour to white:
if (shiftFactor > 0)
{
for (int i = 0; i < pixels.Length; i++)
{
pixels[i] = 255;
}
}

//the area to be drawn to:
Int32Rect drawRegionRect = new Int32Rect(0, 0, (int)myBitmap.PixelWidth, (int)myBitmap.PixelHeight);

//the number of samples available at this line (reduced by one so that the picked sample can't lie beyond the array):
double availableSamples = myDataFile.DataSamples.Length - 1;

for (int i = 0; i < numDataLinesOnDisplay; i++)
{
//the current line to use:
int currentLine = ((numDataLinesOnDisplay - 1) - i) + startLine < 0 ? 0 : ((numDataLinesOnDisplay- 1) - i) + startLine;

for (int j = 0; j < myBitmap.PixelWidth; j++)
{
//data sample to use:
int sampleToUse = (int)(Math.Floor((availableSamples / myBitmap.PixelWidth) * j));

//get the data value:
ushort dataValue = GetDataSamplePixelValue(sampleToUse);

//the pixel to fill with this data value:
int pixelOffset = (((i + shiftFactor) * (int)myBitmap.PixelWidth) + j);

//set the pixel colour values:
pixels[pixelOffset] = dataValue;
}
}

//copy the byte array into the image:
int stride = myBitmap.PixelWidth * bytesPerPixel;
myBitmap.WritePixels(drawRegionRect, pixels, stride, 0);

在这个例子中,startLine 和 shiftFactor 已经设置,并且取决于用户正在查看的数据文件中的哪个点,在数据文件小于屏幕的情况下,shiftFactor 仅非零,在这种情况下我将居中使用此值垂直图像。

最佳答案

在您的代码中查找错误或显示您的完整代码

下一个带有 gray16 图像的示例正常工作

  var width = 300;
var height = 300;

var bitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.Gray16, null);
var pixels = new ushort[width * height];
for (var y = 0; y < height; ++y)
for (var x = 0; x < width; ++x)
{
var v = (0x10000*2 * x/width + 0x10000 * 3 * y / height);
var isMirror = (v / 0x10000) % 2 == 1;
v = v % 0xFFFF;
if (isMirror)
v = 0xFFFF - v;

pixels[y * width + x] = (ushort)v;
}

bitmap.WritePixels(new Int32Rect(0, 0, width, height), pixels, width *2, 0);

var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using (var stream = System.IO.File.Create("gray16.png"))
encoder.Save(stream);

关于c# - 在 WPF 中创建 16 位+ 灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9588367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com