//搜索腐蚀中心 static int SearchCentre(unsigned int *x,unsigned int *y,const TARGET_CONDI *Condition,const SEARCH_AREA *Area) { unsigned int SpaceX,SpaceY,i,j,k,FailCount=0; COLOR_RGB Rgb; COLOR_HSL Hsl; SpaceX = Condition->WIDTH_MIN/3; SpaceY = Condition->HIGHT_MIN/3; for(i=Area->Y_Start;i<Area->Y_End;i+=SpaceY) { for(j=Area->X_Start;j<Area->X_End;j+=SpaceX) { FailCount=0; for(k=0;k<SpaceX+SpaceY;k++) { if(k<SpaceX) ReadColor(j+k,i+SpaceY/2,&Rgb); else ReadColor(j+SpaceX/2,i+(k-SpaceX),&Rgb); RGBtoHSL(&Rgb,&Hsl); if(!ColorMatch(&Hsl,Condition)) FailCount++; if(FailCount>((SpaceX+SpaceY)>>ALLOW_FAIL_PER)) break; } if(k==SpaceX+SpaceY) { *x = j+SpaceX/2; *y = i+SpaceY/2; return 1; } } } return 0; }
//从腐蚀中心向外腐蚀,得到新的腐蚀中心 static int Corrode(unsigned int oldx,unsigned int oldy,const TARGET_CONDI *Condition,RESULT *Resu) { unsigned int Xmin,Xmax,Ymin,Ymax,i,FailCount=0; COLOR_RGB Rgb; COLOR_HSL Hsl; for(i=oldx;i>IMG_X;i--) { ReadColor(i,oldy,&Rgb); RGBtoHSL(&Rgb,&Hsl); if(!ColorMatch(&Hsl,Condition)) FailCount++; if(FailCount>(((Condition->WIDTH_MIN+Condition->WIDTH_MAX)>>2)>>ALLOW_FAIL_PER)) break; } Xmin=i; FailCount=0; for(i=oldx;i<IMG_X+IMG_W;i++) { ReadColor(i,oldy,&Rgb); RGBtoHSL(&Rgb,&Hsl); if(!ColorMatch(&Hsl,Condition)) FailCount++; if(FailCount>(((Condition->WIDTH_MIN+Condition->WIDTH_MAX)>>2)>>ALLOW_FAIL_PER)) break; } Xmax=i; FailCount=0; for(i=oldy;i>IMG_Y;i--) { ReadColor(oldx,i,&Rgb); RGBtoHSL(&Rgb,&Hsl); if(!ColorMatch(&Hsl,Condition)) FailCount++; if(FailCount>(((Condition->HIGHT_MIN+Condition->HIGHT_MAX)>>2)>>ALLOW_FAIL_PER)) break; } Ymin=i; FailCount=0; for(i=oldy;i<IMG_Y+IMG_H;i++) { ReadColor(oldx,i,&Rgb); RGBtoHSL(&Rgb,&Hsl); if(!ColorMatch(&Hsl,Condition)) FailCount++; if(FailCount>(((Condition->HIGHT_MIN+Condition->HIGHT_MAX)>>2)>>ALLOW_FAIL_PER)) break; } Ymax=i; FailCount=0; Resu->x = (Xmin+Xmax)/2; Resu->y = (Ymin+Ymax)/2; Resu->w = Xmax-Xmin; Resu->h = Ymax-Ymin; if(((Xmax-Xmin)>(Condition->WIDTH_MIN)) && ((Ymax-Ymin)>(Condition->HIGHT_MIN)) &&\ ((Xmax-Xmin)<(Condition->WIDTH_MAX)) && ((Ymax-Ymin)<(Condition->HIGHT_MAX)) ) return 1; else return 0; }
MagickExport MagickPassFail GradientImage(Image *image, const PixelPacket *start_color, const PixelPacket *stop_color) { const unsigned long image_rows=image->rows, image_columns=image->columns; long y; unsigned long row_count=0; MagickPassFail status=MagickPass; /* Determine (Hue, Saturation, Brightness) gradient. */ assert(image != (const Image *) NULL); assert(image->signature == MagickSignature); assert(start_color != (const PixelPacket *) NULL); assert(stop_color != (const PixelPacket *) NULL); /* Generate gradient pixels. */ #if defined(HAVE_OPENMP) # pragma omp parallel for shared(row_count, status) #endif for (y=0; y < (long) image->rows; y++) { MagickPassFail thread_status; register long x; register PixelPacket *q; #if defined(HAVE_OPENMP) # pragma omp critical (GM_GradientImage) #endif thread_status=status; if (thread_status == MagickFail) continue; q=SetImagePixelsEx(image,0,y,image->columns,1,&image->exception); if (q == (PixelPacket *) NULL) thread_status=MagickFail; if (q != (PixelPacket *) NULL) { for (x=0; x < (long) image->columns; x++) { BlendCompositePixel(&q[x],start_color,stop_color,(double) MaxRGB*(y*image_columns+x)/(image_columns*image_rows)); } if (!SyncImagePixelsEx(image,&image->exception)) thread_status=MagickFail; } #if defined(HAVE_OPENMP) # pragma omp critical (GM_GradientImage) #endif { row_count++; if (QuantumTick(row_count,image->rows)) if (!MagickMonitorFormatted(row_count,image->rows,&image->exception, GradientImageText,image->filename)) thread_status=MagickFail; if (thread_status == MagickFail) status=MagickFail; } } if (IsGray(*start_color) && IsGray(*stop_color)) image->is_grayscale=MagickTrue; if (IsMonochrome(*start_color) && ColorMatch(start_color,stop_color)) image->is_monochrome=MagickTrue; return(status); }