林大虾1 2016-04-04 13:37 采纳率: 0%
浏览 1652

c#程序里有个地方出错,提示unsafe使用不正确,(c#)

private void button2_Click(object sender, EventArgs e)
{
Bitmap src = new Bitmap(pictureBox1.Image);
int w = pictureBox1.Image.Width;
int h = pictureBox1.Image.Height;
try
{
Bitmap bitmap1 = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
System.Drawing.Imaging.BitmapData myData1 = src.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
System.Drawing.Imaging.BitmapData myData2 = bitmap1.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
unsafe

            {
                byte* pIn = (byte*) myData1.Scan0.ToPointer();
                byte* pOut = (byte*)myData2.Scan0.ToPointer();
                byte* p;
                int Stride =myData1.Stride;
                for(int y = 0;y < h ; y ++)
                {
                    for(int x = 0;x < w; x++)
                    {

                        //边缘8个点像素不变
                        if(x==0|| x==w-1||y==0||y==h-1)
                        {
                            pOut[0]=pIn[0];
                            pOut[1]=pIn[1];
                            pOut[2]=pIn[2];
                        }
                        else
                        {
                            int r0,r1,r2,r3,r4,r5,r6,r7,r8;
                            int g0,g1,g2,g3,g4,g5,g6,g7,g8;
                            int b0,b1,b2,b3,b4,b5,b6,b7,b8;
                            double vR,vG,vB;
                            //左上
                            p=pIn-Stride-3;
                            r1=p[2];
                            g1=p[1];
                            b1=p[0];
                            //正上
                            p=pIn-Stride;
                            r2=p[2];
                            g2=p[1];
                            b2=p[0];
                            //右上
                            p=pIn-Stride + 3;
                            r3=p[2];
                            g3=p[1];
                            b3=p[0];
                            //左
                            p=pIn-3;
                            r4=p[2];
                            g4=p[1];
                            b4=p[0];
                            //右
                            p=pIn+Stride-3;
                            r5=p[2];
                            g5=p[1];
                            b5=p[0];
                            //左下
                            p=pIn+Stride-3;
                            r6=p[2];
                            g6=p[1];
                            b6=p[0];
                            //正下
                            p=pIn+Stride;
                            r7=p[2];
                            g7=p[1];
                            b7=p[0];
                            //右下
                            p=pIn+Stride+3;
                            r8=p[2];
                            g8=p[1];
                            b8=p[0];
                            //中心点
                            p=pIn;
                            r0=p[2];
                            g0=p[1];
                            b0=p[0];
                            //使用模板
                            vR = (double) ((r1+r3+r6+r8+2*r2+2*r4+2*r7+2*r5+4*r0)/16);
                            vG = (double) ((g1+g3+g6+g8+2*g2+2*g4+2*g7+2*g5+4*r0)/16);
                            vB = (double) ((b1+b3+b6+b8+2*b2+2*b4+2*b7+2*b5+4*r0)/16);
                            if(vR>0)
                            {
                                vR = Math.Min(255,vR);
                            }
                            else
                            {
                                vR = Math.Max(0,vR);
                            }
                            if(vG>0)
                            {
                                vG=Math.Min(255,vG);
                            }
                            else
                            {
                                vG=Math.Max(0,vG);
                            }
                            if(vB>0)
                            {
                                vB=Math.Min(255,vB);
                            }
                            else
                            {
                                vB=Math.Max(0,vB);
                            }
                            double temp =(vR*19595+vG*38469+vB*7472)/65536;
                            pOut[0]=(byte)temp;
                            pOut[1]=(byte)temp;
                            pOut[2]=(byte)temp;
                        }
                        pIn+=3;
                        pOut+=3;
                    }
                    pIn+=myData1.Stride-w*3;
                    pOut+=myData1.Stride-w*3;
                }
            }
            src.UnlockBits(myData1);
            bitmap1.UnlockBits(myData2);
            pictureBox2.Image=bitmap1;
        }
        catch
        {
            pictureBox2.Image=null;
        }
    }

# ## # ```![图片说明](https://img-ask.csdn.net/upload/201604/04/1459776948_516228.png)c#

  • 写回答

4条回答 默认 最新

  • 林大虾1 2016-04-04 13:39
    关注

    图片说明

    评论

报告相同问题?

悬赏问题

  • ¥100 高价邀请复制 域天d8联网狗
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?