在我的任务中,需要对cximage中的图片按照固定方格大小进行切分,找到crop函数,代码实现如下:
CString strname;
RECT r;
int w = 200;
int h = 250;
r.left = 10;
r.top = 10;
CxImage orgimage(buf, size, CXIMAGE_FORMAT_BMP); // 定义一个CxImage对象
CxImage image;
for(int i = 0; i < 2; ++ i)
{
r.left = 10;
for(int j = 0; j < 2; ++ j)
{
strname.Format(L"crop%d%d.bmp", i, j);
r.left =10 + j * w;
r.top = 10 + i * h;
r.right = r.left + w;
r.bottom = r.top + h;
orgimage.Crop(r, &image);
...
...
实测后发现确实将一个图片切割成4张小图片,用画图工具,将4副图片能合并成原来的图片。
这里注意的是,orgimage.Crop(r, &image);其中image对象只创建一个,避免多次重复创建切割图片的cximage对象。另外一个接口是image=orgimage.Crop(r),跟进代码中发现这个接口里直接修改了当前的cximage对象,这样的话,就需要每次对orgimage构造一个新的image对象,这样的话,会造成效率低(个人感觉,:P)。
第二个任务是:对每次生成的图片需要过滤,即图片仅仅是背景色的,不需要重新切割并生成文件了。
做个重载函数crop,加入crback颜色值参数,仅仅对24位色图片处理,部分处理代码
int nEqualNum = 0;
int num = 0;
for(long y=starty; y<endy; y++){
info.nProgress = (long)(100*(y-starty)/(endy-starty)); //<Anatoly Ivasyuk>
num = linelen / 3;
for(int k = 0; k < num; ++ k)
{
// 相同,则累加个数
if(memcmp(pSrc + k * 3, backColor, 3) == 0){
++ nEqualNum;
}
}
memcpy(pDest,pSrc,linelen);
pDest+=tmp.info.dwEffWidth;
pSrc+=info.dwEffWidth;
}
// 如果相同点个数大于99.9%,则返回不进行处理
double rato = (double(nEqualNum) / (double(endy - starty) * num)) * 100.0;
if(rato > 99.99)
{
return false;
}
这里对背景色占总像素比例判断,认为如果大于99.99的话,则认为基本就是纯背景的图片了。