【问题标题】:Convert int[] to byte[] type pointer in C#在 C# 中将 int[] 转换为 byte[] 类型指针
【发布时间】:2023-04-09 12:21:01
【问题描述】:

我需要将 int[] 转换为 byte[] 指针。 为了能够逐像素填充 WriteableBitmap 的条目,需要执行上述操作,如下所示:

//previewBuffer1 is of type byte[]
WriteableBitmap wb1 = new WriteableBitmap(nVidWidth, nVidHeight);
int k=0;
// wb1.Pixels is of type int[] by default
byte* data = (byte*) wb1.Pixels;  // ****THIS DOESN'T WORK. THROWS ERROR. HOW CAN I ACCOMPLISH THIS***
for (int i=0; i<nVidHeight; i++){
    for (int j=0; j<nVidWidth; j++){
        byte grayscaleval = previewBuffer1[k];
        data [4*k] = grayscaleval ;
        data [4*k + 1] = grayscaleval ;
        data [4*k + 2] = grayscaleval ;
        k++;
    }
}

如何获得 wb1.Pixels 的 int[] 类型的 byte* 指针?

【问题讨论】:

  • 为什么不使用 int[] 执行操作?为什么需要字节[]?
  • 好吧。 WriteableBitmap 将图像信息作为 RGBA 存储在单个整数中。要访问 R、G、B 通道,我需要以字节形式访问它们...
  • 我不知道是不是只有我一个人,但我发现在 WP8 上编写图像处理应用程序代码非常可怕。不同 API 之间的兼容性似乎很差。

标签: c# image-processing windows-phone-8 windows-phone


【解决方案1】:

听起来您想将数组中的每个 int 视为字节序列 - BitConverter.GetBytes 怎么样?

byte[] bytes = BitConverter.GetBytes(intValue);

如果您想避免数组复制等,请使用允许指针的unsafe(您需要在项目属性中勾选“允许不安全代码”复选框):

unsafe static void UnsafeConvert(int value)
{
    byte* bytes = (byte*)&value;
    byte first = bytes[0];
    ...
}

【讨论】:

  • 您正确理解了我的问题。但我需要在原始 int 位置保存三个字节。您提到的那个会将字节存储在不同的位置。
  • 谢谢。我不知道存在这种不安全铸造的选项。反正我已经用另一种技术解决了,你可以找到它作为对这个问题的回复。
【解决方案2】:

我对您的循环感到困惑,因为我认为它存在一些问题……但看起来您正试图去除 RGBA 数据的 alpha 分量。为什么不这样做:

假设您有: 1.一个byte[]你想存储没有Alpha分量的RGB数据 2.一个int [] RGBA数据源

int offset=0; // offset into the 'dest' array of bytes

for (...) // loop through your source array of ints 
{
    // get this current int value as rgba_val
    int rgba_val = (whatever your RGBA source is..is it wb1.Pixels?)

    dest[offset] = (rgba_val & 0xff) >> 24;
    dest[offset+1] = (rgba_val & 0x00ff) >> 16;
    dest[offset+2] = (rgba_val & 0x0000ff) >> 8;
}

【讨论】:

  • 在这个例子中,previewBuffer1 基本上是一个灰度图像。我想将相同的值复制到 RGB 值,以便 RGB 图像模拟灰度图像。在您的代码中,问题是 dest 应该是一个指向 8 位值的指针。而“wb1.Pixels”,我需要存储它的位置是 int[]
【解决方案3】:

我想下面的方法对我有用:

//previewBuffer1 is of type byte[]
WriteableBitmap wb1 = new WriteableBitmap(nVidWidth, nVidHeight);
int k=0;
// wb1.Pixels is of type int[] by default
//byte* data = (byte*) wb1.Pixels;  // ****NOT REQUIRED ANYMORE***
for (int i=0; i<nVidHeight; i++){
    for (int j=0; j<nVidWidth; j++){
        int grayscaleval = (int) previewBuffer1[k];
        wb1.Pixels[k] = ((grayscaleval) | (grayscaleval<<8) | (grayscaleval<<16) | (0xFF<<24)); // 0xFF is for alpha blending value

        k++;
    }
}

至少在逻辑上似乎没问题。还没来得及试一试。

【讨论】:

  • 我可以确认上述方法有效,并且可能是我的应用程序的最佳解决方案。
【解决方案4】:

用它把你的 int 数组转换成 bytes 数组

WriteableBitmap wb1 = new WriteableBitmap(100, 100);
int[] pixels = wb1.Pixels;
byte[] data = new byte[pixels.Length];
for (int i= 0; i < pixels.Length;i ++)
{
    data[i] = (byte)pixels[i];
}

【讨论】:

  • 我想最终将这些东西存储到 int 数组中。 wb1 是一个 int[],但每个整数条目都是一个 RGBA 值。我想在适当的位置操作 RGBA 值,以便稍后在图像窗口中显示它。上述解决方案对我不起作用。无论如何,谢谢。
猜你喜欢
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2011-08-19
相关资源
最近更新 更多