BUG 1:GDI+ Image::FromFile 无效,调用图像指针始终为NULL
m_pImg = Gdiplus::Bitmap::FromFile(m_imgFilePath);
m_pImg为NULL
原因是没有初始化GDI+。
Solution:
1、声明两个全局变量:
2、在其初始化函数InitInstance()中添加:
3、在需要调用 GDI+中的函数的页面上方 或者 在头文件 stdafx.h 中添加:
GdiplusStartupInput m_Gdistart;
ULONG_PTR m_GdiplusToken;
2、在其初始化函数InitInstance()中添加:
GdiplusStartup(&m_GdiplusToken,& m_Gdistart,NULL);
3、在需要调用 GDI+中的函数的页面上方 或者 在头文件 stdafx.h 中添加:
#include "gdiplus.h"
using namespace Gdiplus;
BUG2:GDI+ new Bitmap不能接受三个参数
//创建目标Bitmap
Bitmap *bmpDest = new Bitmap(destWidth, destHeight, m_pImg->GetPixelFormat());
原因是微软的 DEBUG_NEW 和 GDI+ 不匹配造成的。
Solution:将以下三行注释掉
//#ifdef _DEBUG
//#define new DEBUG_NEW
//#endif
BUG3:BGR BGR BGR to RRRGGGBBB,转化出错,图片颜色不一样
见下图:
最后我将图片读入MATLAB分析,发现:
A1 转化后,B1原图,发现出现的是值的差别,最后定位如下:
BUG4:不同图像显示出错,如下所示:
正常结果
异常结果
遇到这个结果,我首先想到的是——是不是图片数据的方向搞错了,因为之前就是搞错了数据的存放方式,原本数据按列存放,结果我按行处理就出现的严重的变形,不过那样的图片结果基本看不出原来的任何图片形状。然后,我就想到了另一个问题,也就是不久前刚碰到的一个问题,即在我在一张扩展边缘后的图片上截取原始图片大小的时候,在偏移下标位置时,不小心少算了一个像素,结果就造成了如上图般类似的结果。但是,这应该不会是这个问题,因为不是每张图片都出现这样的问题。
那么,我接着就想,会不会是因为图片高宽的影响,程序适用于height大于width的情况,实验如下:
很不幸,不是这样子的原因。
~~~~~~~~接着~~~我试了如下可能:
(1)是否是图片像素格式不一样,程序里面貌似是图片貌似适用于24位,可能图片是32位;
(2)是否是图片大小的问题。
最后发现,原来是因为图片的长宽的奇数问题——程序写的不够鲁棒。
本文地址:http://blog.csdn.net/linj_m/article/details/34414289
更多资源 请关注 博客:LinJM-机器视觉 微博:林建民-机器视觉