我有一个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;
}
我尝试过的事情:
我很确定它与像素值不同而不是实际找到基准点的算法有关,但我可能错了。我首先想知道为什么像素值的显示方式不同。
感谢您提供任何帮助/线索。
**更新** 由于TaW在评论中的建议,我取得了一些进展。他问TIF是否被压缩了。
当我用IrfanViewer查看TIF信息时,它显示它正在使用LZW压缩。我保存了一份有问题的Greyscale TIF副本,并选择不压缩图像。当我用这个图像调试单元测试时,我能够看到我希望的值和单元测试通过。似乎压缩正在影响像素值,并且在我的新设置中有些不同。
有趣的是,这些像素值的差异似乎不会出现在彩色图像上,即使它们也是用LZW压缩的。
有关新设置可能会有什么不同的原因还有进一步的想法吗?