C# 在C中将int[]转换为byte[]类型指针#

C# 在C中将int[]转换为byte[]类型指针#,c#,image-processing,windows-phone-8,windows-phone,C#,Image Processing,Windows Phone 8,Windows Phone,我需要将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;

我需要将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++;
    }
}
//previewBuffer1的类型为byte[]
WriteableBitmap wb1=新的WriteableBitmap(nVidWidth,nVidHeight);
int k=0;
//默认情况下,像素的类型为int[]
字节*数据=(字节*)wb1.Pixels;//****这不管用。抛出错误。我怎样才能做到这一点***

对于(int i=0;i我被您的循环弄糊涂了,因为我认为它有一些问题…但看起来您正在尝试剥离RGBA数据的alpha组件。为什么不执行以下操作:

假设你有: 1.一个字节[]用于存储不带Alpha组件的RGB数据 2.RGBA数据的int[]源

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;
}

使用此选项将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];
}
WriteableBitmap wb1=新的WriteableBitmap(100100);
int[]像素=wb1.像素;
字节[]数据=新字节[pixels.Length];
对于(int i=0;i
听起来像是要将数组中的每个
int
视为字节序列-如何


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


我想下面这些对我来说是可行的:

//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++;
    }
}
//previewBuffer1的类型为byte[]
WriteableBitmap wb1=新的WriteableBitmap(nVidWidth,nVidHeight);
int k=0;
//默认情况下,像素的类型为int[]
//字节*数据=(字节*)wb1.Pixels;//****不再需要***

对于(int i=0;i为什么不使用int[]执行操作?为什么需要字节[]?好的。WriteableBitmap将图像信息存储为单个整数中的RGBA。要访问R、G、B通道,我需要以字节的形式访问它们……我不知道是否只有我一个人,但我发现在WP8上编写图像处理应用程序从外表上看非常可怕。不同API之间的互兼容性似乎很差。基本上,在这种情况下例如,previewBuffer1是灰度图像。我想将相同的值复制到RGB值,以便RGB图像模拟灰度图像。在您的代码中,问题是dest应该是指向8位值的指针。而“wb1.Pixels”,我需要存储它的位置是int[],我想最终将内容存储到int数组中。wb1是int[],但每个整数项都是一个RGBA值。我想就地操作RGBA值,以便以后在图像窗口中显示它。上述解决方案对我不起作用。无论如何,谢谢。您正确理解了我的问题。但我需要在原始int位置保存三个字节。您提到的那个将在另一个位置。谢谢。我不知道存在这样一个不安全铸造的选项。我已经用另一种技术解决了它,你可以找到它作为对这个问题的回答。我可以确认上述方法有效,并且可能是我申请的最佳解决方案。
unsafe static void UnsafeConvert(int value)
{
    byte* bytes = (byte*)&value;
    byte first = bytes[0];
    ...
}
//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++;
    }
}