Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将像素设置为PictureBox_C#_Graphics_Pixels_Imaging - Fatal编程技术网

C# 将像素设置为PictureBox

C# 将像素设置为PictureBox,c#,graphics,pixels,imaging,C#,Graphics,Pixels,Imaging,上下文:我有一个程序可以获取任何图像的ArGB。将其放入Color ARGBFormat=Color.FromArgb(alpha、红色、绿色、蓝色)现在我想把它放到一个图片盒里。我没有一个完整的像素阵列(它或多或少是分散的) 代码: Bitmap bmp=新位图(ImagePath); 矩形bmpRec=新矩形(0,0,bmp.Width,bmp.Height)//创建用于保存图片的矩形 BitmapData bmpData=bmp.LockBits(bmpRec,ImageLockMode.

上下文:我有一个程序可以获取任何图像的ArGB。将其放入
Color ARGBFormat=Color.FromArgb(alpha、红色、绿色、蓝色)现在我想把它放到一个图片盒里。我没有一个完整的像素阵列(它或多或少是分散的)

代码:

Bitmap bmp=新位图(ImagePath);
矩形bmpRec=新矩形(0,0,bmp.Width,bmp.Height)//创建用于保存图片的矩形
BitmapData bmpData=bmp.LockBits(bmpRec,ImageLockMode.ReadWrite,PixelFormat.Format32bppArgb)//获取位图数据
IntPtr Pointer=bmpData.Scan0;
int DataBytes=Math.Abs(bmpData.Stride)*bmp.Height//获取数组大小
字节[]rgbValues=新字节[数据字节]//创建数组
副本(指针,RGB值,0,数据字节)//内存不足的副本
StringBuilder EveryPixel=新的StringBuilder(“”);
int PixelSize=4;
彩色ARGBFormat;
位图ImageOut=新位图(bmp.Width,bmp.Height);
不安全的
{
对于(int y=0;y
我想使用我一直在处理的代码^在不使用SetPixels的情况下显示到PictureBox中。我想使用锁位,因为它是最优化的方法。

给你

循环前的初始化代码

BitmapData bitmapData = ImageOut.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

byte[] pixels = new byte[bmp.Width * bmp.Height * 4]; //4 means 1 byte for each a r g b
IntPtr ptr = bitmapData.Scan0;
Marshal.Copy(ptr , pixels, 0, pixels.Length);
更新循环中的像素

pixels[offSet] = blue;
pixels[offSet + 1] = green;
pixels[offSet + 2] = red;
pixels[offSet + 3] = alpha;
最后是清理代码

bitmapData.UnlockBits();
所以对我来说,代码看起来像

unsafe
{

   BitmapData bitmapData = ImageOut.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

   byte[] pixels = new byte[bmp.Width * bmp.Height * 4]; //4 means 1 byte for each a r g b
   IntPtr ptr = bitmapData.Scan0;
   Marshal.Copy(ptr , pixels, 0, pixels.Length);

   for (int y = 0; y < bmpData.Height; y++)
   {
        byte* row = (byte*)bmpData.Scan0 + (y * bmpData.Stride);
        for (int x = 0; x < bmpData.Width; x++)
        {
            int offSet = x * PixelSize;
            // read pixels
            byte blue = row[offSet];
            byte green = row[offSet + 1];
            byte red = row[offSet + 2];
            byte alpha = row[offSet + 3];

            //copy to target
            pixels[offSet] = blue;
            pixels[offSet + 1] = green;
            pixels[offSet + 2] = red;
            pixels[offSet + 3] = alpha;
        }
    }
    bitmapData.UnlockBits();
}

//set to picturebox
pictureBox.Image = ImageOut;
不安全
{
BitmapData BitmapData=ImageOut.LockBits(rect,ImageLockMode.ReadWrite,PixelFormat.Format32bppArgb);
byte[]pixels=新字节[bmp.Width*bmp.Height*4];//4表示每个a/g b有一个字节
IntPtr ptr=bitmapData.Scan0;
复制(ptr,像素,0,像素。长度);
对于(int y=0;y

我希望这对您有用。

谢谢您的建议和帮助,但我需要将它们显示在图片框中。你知道怎么做吗?这相当简单
pictureBox.Image=ImageOut
unsafe
{

   BitmapData bitmapData = ImageOut.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

   byte[] pixels = new byte[bmp.Width * bmp.Height * 4]; //4 means 1 byte for each a r g b
   IntPtr ptr = bitmapData.Scan0;
   Marshal.Copy(ptr , pixels, 0, pixels.Length);

   for (int y = 0; y < bmpData.Height; y++)
   {
        byte* row = (byte*)bmpData.Scan0 + (y * bmpData.Stride);
        for (int x = 0; x < bmpData.Width; x++)
        {
            int offSet = x * PixelSize;
            // read pixels
            byte blue = row[offSet];
            byte green = row[offSet + 1];
            byte red = row[offSet + 2];
            byte alpha = row[offSet + 3];

            //copy to target
            pixels[offSet] = blue;
            pixels[offSet + 1] = green;
            pixels[offSet + 2] = red;
            pixels[offSet + 3] = alpha;
        }
    }
    bitmapData.UnlockBits();
}

//set to picturebox
pictureBox.Image = ImageOut;