从同一图像文件中获取不同的位图对象

时间:2013-11-17 22:38:08

标签: c# .net bitmap bitmapimage

我正在从同一张图片创建Bitmap对象,但最终会得到不同的结果。它应该计算出与图像颜色的偏差,图像是否相同,为什么结果不同?

 double test1 = GetStdDev("C:\\temp\\images\\file.jpg");
 Bitmap img = new Bitmap("C:\\temp\\images\\file.jpg");
 double test2 = GetStdDev(img);

 public static double GetStdDev(string imageFileName)
 {
        double total = 0, totalVariance = 0;
        int count = 0;
        double stdDev = 0;

        // First get all the bytes
        using (Bitmap b = new Bitmap(imageFileName))
        {
            BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, b.PixelFormat);
            int stride = bmData.Stride;
            IntPtr Scan0 = bmData.Scan0;
            unsafe
            {
                byte* p = (byte*)(void*)Scan0;
                int nOffset = stride - b.Width * 3;
                for (int y = 0; y < b.Height; ++y)
                {
                    for (int x = 0; x < b.Width; ++x)
                    {
                        count++;

                        byte blue = p[0];
                        byte green = p[1];
                        byte red = p[2];

                        int pixelValue = Color.FromArgb(0, red, green, blue).ToArgb();
                        total += pixelValue;
                        double avg = total / count;
                        totalVariance += Math.Pow(pixelValue - avg, 2);
                        stdDev = Math.Sqrt(totalVariance / count);

                        p += 3;
                    }
                    p += nOffset;
                }
            }

            b.UnlockBits(bmData);
        }

        return stdDev;
  }

 private static double GetStdDev(Bitmap img)
 {
        double total = 0, totalVariance = 0;
        int count = 0;
        double stdDev = 0;

        // First get all the bytes
        using (Bitmap b = new Bitmap(img))
        {
            BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, b.PixelFormat);
            int stride = bmData.Stride;
            IntPtr Scan0 = bmData.Scan0;
            unsafe
            {
                byte* p = (byte*)(void*)Scan0;
                int nOffset = stride - b.Width * 3;
                for (int y = 0; y < b.Height; ++y)
                {
                    for (int x = 0; x < b.Width; ++x)
                    {
                        count++;

                        byte blue = p[0];
                        byte green = p[1];
                        byte red = p[2];

                        int pixelValue = Color.FromArgb(0, red, green, blue).ToArgb();
                        total += pixelValue;
                        double avg = total / count;
                        totalVariance += Math.Pow(pixelValue - avg, 2);
                        stdDev = Math.Sqrt(totalVariance / count);

                        p += 3;
                    }
                    p += nOffset;
                }
            }

            b.UnlockBits(bmData);
        }

        return stdDev;
    }

1 个答案:

答案 0 :(得分:0)

刚刚找到解决方案,这是深度复制位图对象的问题。而是使用新的Bitmap(img)使用Bitmap img2 =(Bitmap)img.Clone();不知道这是正确的解决方案,但它确实起到了作用。