Windows 7上的位图像素值与XP上的不同

时间:2014-04-24 22:33:23

标签: c# .net windows bitmap

我有一个Windows Forms应用程序,我正在升级以定位更新的.Net Framework。对于我的一个单元测试,灰度TIFF图像用于创建位图。提取像素数据,然后通过算法运行以确定图像中的基准点的中心。在Windows XP,Visual Studio 2005,.Net Framework 2.0上找到正确的中心并通过测试。在Windows 7 64位,Visual Studio 2013,.Net Framework 4.0上,测试失败,因为它找到的中心关闭了一小部分。

我通过调试并查看Byte数组,检查了一台机器上的像素数据。 XP计算机上的像素值与Windows 7计算机上的像素值略有不同。它在两台机器上都是完全相同的图像和相同的代码。另一件事是,这只发生在灰度图像上,所有彩色图像都通过,我检查的图像具有相同的像素值。最后,根据我在调试时检查的位图属性,所讨论的图像看起来是完全相同的宽度和高度。

以下是Windows XP计算机的前10个像素值:

    [0] 94  byte
    [1] 92  byte
    [2] 92  byte
    [3] 91  byte
    [4] 92  byte
    [5] 94  byte
    [6] 93  byte
    [7] 92  byte
    [8] 90  byte
    [9] 91  byte
    [10]    91  byte

以下是Windows 7计算机的前10个值:

    [0] 85  byte
    [1] 102 byte
    [2] 85  byte
    [3] 85  byte
    [4] 85  byte
    [5] 85  byte
    [6] 102 byte
    [7] 85  byte
    [8] 85  byte
    [9] 85  byte
    [10]    85  byte

以下是测试方法:

 public void Test_CenteringBottomMiddle8BitMono()
    {
        int centerX, centerY;
        DoCenter(path + "BottomMiddle - 8 - Mono.tif", out centerX, out centerY, "npf02");
        CheckOffsets(centerX, centerY, 0, centerOffsetPixels);
    }

DoCenter方法:

 private void DoCenter(string filename, out int centerX, out int centerY, string fiducialType)
    {
        if (File.Exists(filename))
        {
            Bitmap bmp = new Bitmap(filename);
            CenterCalibration center = new CenterCalibration();
            byte[] bytes = ImageProcessing.GetByteStream(bmp);

            int numChan = 1;
            if (bmp.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb)
            {
                numChan = 3;
            }
            center.GetCenterPoint(bytes, bmp.Width, bmp.Height, numChan, out centerX, out centerY, fiducialType);
            Console.WriteLine("{0} (Center Coords): {1},{2}", filename, centerX, centerY);
        }
        else
        {
            string msg = string.Format("File: {0} Does Not Exist.", filename);
            throw new FileNotFoundException(msg);
        }
    }

GetByteStream方法:

 public static byte[] GetByteStream(Bitmap bmp)
    {
        DateTime startFunctionTimer = DateTime.Now;
        DateTime endFunctionTimer;
        DateTime startTimer, endTimer;

        startTimer = DateTime.Now;

        int numChan = 1;
        if (bmp.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb)
        {
            numChan = 3;
        }

        System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
        byte[] dst = new byte[bmp.Width * bmp.Height * numChan];
        byte[] src = new byte[bmpData.Stride * bmp.Height];

        startTimer = DateTime.Now;

        System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, src, 0, dst.Length);
        for (int i = 0; i < bmp.Height; i++)
        {
            Buffer.BlockCopy(src, (i * bmpData.Stride), dst, (i * bmp.Width * numChan), bmp.Width * numChan);
        }

        endTimer = DateTime.Now;

        bmp.UnlockBits(bmpData);

        TimeSpan functionInterval, timerInterval;
        timerInterval = endTimer - startTimer;
        endFunctionTimer = DateTime.Now;
        functionInterval = endFunctionTimer - startFunctionTimer;
        //            Console.WriteLine("GetByteStream() Total = {0}, CopyTimer = {1}", functionInterval.TotalMilliseconds, timerInterval.TotalMilliseconds);

        return dst;
    }

我尝试过的事情:

  1. 在新机器上定位原始.Net Framework。
  2. 创建Bitmap对象时打开和关闭颜色校正。
  3. 确认两台计算机上的像素格式相同。 Format8BppIndexed
  4. 我很确定它与像素值不同而不是实际找到基准点的算法有关,但我可能错了。我首先想知道为什么像素值的显示方式不同。

    感谢您提供任何帮助/线索。

    **更新** 由于TaW在评论中的建议,我取得了一些进展。他问TIF是否被压缩了。

    当我用IrfanViewer查看TIF信息时,它显示它正在使用LZW压缩。我保存了一份有问题的Greyscale TIF副本,并选择不压缩图像。当我用这个图像调试单元测试时,我能够看到我希望的值和单元测试通过。似乎压缩正在影响像素值,并且在我的新设置中有些不同。

    有趣的是,这些像素值的差异似乎不会出现在彩色图像上,即使它们也是用LZW压缩的。

    有关新设置可能会有什么不同的原因还有进一步的想法吗?

0 个答案:

没有答案