【问题标题】:c# How to convert ushort value into byte so that I can display them in pictureboxc# 如何将 ushort 值转换为字节,以便我可以在图片框中显示它们
【发布时间】:2018-05-26 20:49:00
【问题描述】:
    public void accessHi3DRange(buffer)
    {
        double meanR = 0;
        uint sumR = 0;
        uint countR = 0;
        int numberOfScansR = buffer.Height;
        bitmapHeight = numberOfScansR;

        int subCompWidth = buffer.Components["Hi3D 1"].SubComponents["Range"].Format.Width;
        bitmapWidth = subCompWidth;
        ushort[,] data = buffer.Components["Hi3D 1"].SubComponents["Range"].GetRows<ushort>(0, numberOfScansR);

        for (int scan = 0; scan < numberOfScansR; scan++)
        {

            for (int col = 0; col < subCompWidth; col++)
            {
                ushort val = data[scan, col];
                if (val != 0)
                {
                    sumR += val;
                    drawPix(col, scan, (int)val, (int)val, (int)val);
                    countR++;
                }
            }
        }
    }

    private void drawPix(int x, int y, int r, int g, int b)
    {
        ((Bitmap)pictureBox1.Image).SetPixel(x, y, Color.FromArgb(r, g, b));
        return;
    }

当我运行我得到的代码时

System.ArgumentException:'655' 的值对'red' 无效。 'red' 应大于或等于 0 且小于或等于 255。'

所以要解决这个错误,我想将ushort 值转换为byte 以便它可以显示在图片框中。 如果是这样,我该如何转换?

【问题讨论】:

  • byte 是一种较小的数据类型 - 8 位 - 而 ushort 是 16 位。您无法在不丢失数据的情况下将 ushort 转换为 byte
  • 您是否尝试从 16 位图像中读取?我认为您想显示为 24 位 RGB(对一个像素使用 3 个字节(字节 1 = 红色,字节 2 = 绿色,字节 3 = 蓝色)?最好提供一些输入文件的链接来测试这一点。看看public void accessHi3DRange(buffer) 所以buffer的内容是什么?如何测试你的代码?...@Jiexian

标签: c# image image-processing byte ushort


【解决方案1】:

我认为问题出在这里:

drawPix(col, scan, (int)val, (int)val, (int)val);

因为您将这些大的ints 传递给Color.FromArgb(r, g, b) 函数。 MSDN 在这里说https://msdn.microsoft.com/en-us/library/cce5h557(v=vs.110).aspx R、G 和 B 的值必须是 0 到 255。

我认为你想要的是这个重载:https://msdn.microsoft.com/en-us/library/2zys7833(v=vs.110).aspx,它获取完整的int,然后将其从那里分成 a、r、g 和 b。

这需要对您的代码进行以下编辑:

 public void accessHi3DRange(buffer)
    {
        double meanR = 0;
        uint sumR = 0;
        uint countR = 0;
        int numberOfScansR = buffer.Height;
        bitmapHeight = numberOfScansR;

        int subCompWidth = buffer.Components["Hi3D 1"].SubComponents["Range"].Format.Width;
        bitmapWidth = subCompWidth;
        ushort[,] data = buffer.Components["Hi3D 1"].SubComponents["Range"].GetRows<ushort>(0, numberOfScansR);

        for (int scan = 0; scan < numberOfScansR; scan++)
        {

            for (int col = 0; col < subCompWidth; col++)
            {
                ushort val = data[scan, col];
                if (val != 0)
                {
                    sumR += val;
                    drawPix(col, scan, (int)val);
                    countR++;
                }
            }
        }
    }

    private void drawPix(int x, int y, int rgb)
    {
        ((Bitmap)pictureBox1.Image).SetPixel(x, y, Color.FromArgb(rgb));
        return;
    }

【讨论】:

    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多