Changeset 14763
- Timestamp:
- 06/24/08 17:40:53 (5 months ago)
- Files:
-
- trunk/gdal/apps/nearblack.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/gdal/apps/nearblack.cpp
r12792 r14763 32 32 33 33 static void ProcessLine( GByte *pabyLine, int iStart, int iEnd, int nBands, 34 int nNearDist, int nMaxNonBlack, int bNearWhite ); 34 int nNearDist, int nMaxNonBlack, int bNearWhite, 35 int *panLastLineCounts, 36 int bDoHorizontalCheck, 37 int bDoVerticalCheck ); 35 38 36 39 /************************************************************************/ … … 156 159 /* -------------------------------------------------------------------- */ 157 160 GByte *pabyLine; 161 int *panLastLineCounts; 158 162 159 163 pabyLine = (GByte *) CPLMalloc(nXSize * nBands); 164 165 panLastLineCounts = (int *) CPLCalloc(sizeof(int),nXSize); 160 166 161 167 /* -------------------------------------------------------------------- */ … … 175 181 176 182 ProcessLine( pabyLine, 0, nXSize-1, nBands, nNearDist, nMaxNonBlack, 177 bNearWhite );183 bNearWhite, panLastLineCounts, TRUE, TRUE ); 178 184 ProcessLine( pabyLine, nXSize-1, 0, nBands, nNearDist, nMaxNonBlack, 179 bNearWhite );185 bNearWhite, NULL, TRUE, FALSE ); 180 186 181 187 eErr = GDALDatasetRasterIO( hOutDS, GF_Write, 0, iLine, nXSize, 1, … … 185 191 break; 186 192 187 GDALTermProgress( (iLine+1) / (double) nYSize, NULL, NULL ); 193 GDALTermProgress( 0.5 * ((iLine+1) / (double) nYSize), NULL, NULL ); 194 } 195 196 /* -------------------------------------------------------------------- */ 197 /* Now process from the bottom back up, doing only the vertical pass.*/ 198 /* -------------------------------------------------------------------- */ 199 memset( panLastLineCounts, 0, sizeof(int) * nXSize); 200 201 for( iLine = nYSize-1; iLine >= 0; iLine-- ) 202 { 203 CPLErr eErr; 204 205 eErr = GDALDatasetRasterIO( hOutDS, GF_Read, 0, iLine, nXSize, 1, 206 pabyLine, nXSize, 1, GDT_Byte, 207 nBands, NULL, nBands, nXSize * nBands, 1 ); 208 if( eErr != CE_None ) 209 break; 210 211 ProcessLine( pabyLine, 0, nXSize-1, nBands, nNearDist, nMaxNonBlack, 212 bNearWhite, panLastLineCounts, FALSE, TRUE ); 213 214 eErr = GDALDatasetRasterIO( hOutDS, GF_Write, 0, iLine, nXSize, 1, 215 pabyLine, nXSize, 1, GDT_Byte, 216 nBands, NULL, nBands, nXSize * nBands, 1 ); 217 if( eErr != CE_None ) 218 break; 219 220 GDALTermProgress( 0.5 + 0.5 * (nYSize-iLine) / (double) nYSize, 221 NULL, NULL ); 188 222 } 189 223 190 224 CPLFree(pabyLine); 225 CPLFree( panLastLineCounts ); 226 191 227 GDALClose( hOutDS ); 192 228 if( hInDS != hOutDS ) … … 203 239 204 240 static void ProcessLine( GByte *pabyLine, int iStart, int iEnd, int nBands, 205 int nNearDist, int nMaxNonBlack, int bNearWhite ) 241 int nNearDist, int nMaxNonBlack, int bNearWhite, 242 int *panLastLineCounts, 243 int bDoHorizontalCheck, 244 int bDoVerticalCheck ) 206 245 207 246 { 208 247 int iDir, i; 209 int nNonBlackPixels = 0; 210 211 if( iStart < iEnd ) 212 iDir = 1; 213 else 214 iDir = -1; 215 216 for( i = iStart; i != iEnd; i += iDir ) 217 { 218 int iBand; 219 int bIsNonBlack = FALSE; 220 221 for( iBand = 0; iBand < nBands; iBand++ ) 222 { 223 if( bNearWhite ) 224 { 225 if( (255 - pabyLine[i * nBands + iBand]) > nNearDist ) 248 249 /* -------------------------------------------------------------------- */ 250 /* Vertical checking. */ 251 /* -------------------------------------------------------------------- */ 252 if( bDoVerticalCheck ) 253 { 254 int nXSize = MAX(iStart+1,iEnd+1); 255 256 for( i = 0; i < nXSize; i++ ) 257 { 258 int iBand; 259 int bIsNonBlack = FALSE; 260 261 // are we already terminated for this column? 262 if( panLastLineCounts[i] > nMaxNonBlack ) 263 continue; 264 265 for( iBand = 0; iBand < nBands; iBand++ ) 266 { 267 268 if( bNearWhite ) 226 269 { 227 bIsNonBlack = TRUE; 228 break; 270 if( (255 - pabyLine[i * nBands + iBand]) > nNearDist ) 271 { 272 bIsNonBlack = TRUE; 273 break; 274 } 229 275 } 276 else 277 { 278 if( pabyLine[i * nBands + iBand] > nNearDist ) 279 { 280 bIsNonBlack = TRUE; 281 break; 282 } 283 } 284 } 285 286 if( bIsNonBlack ) 287 { 288 panLastLineCounts[i]++; 289 290 if( panLastLineCounts[i] > nMaxNonBlack ) 291 continue; 230 292 } 231 293 else 232 { 233 if( pabyLine[i * nBands + iBand] > nNearDist ) 294 panLastLineCounts[i] = 0; 295 296 for( iBand = 0; iBand < nBands; iBand++ ) 297 { 298 if( bNearWhite ) 299 pabyLine[i * nBands + iBand] = 255; 300 else 301 pabyLine[i * nBands + iBand] = 0; 302 } 303 } 304 } 305 306 /* -------------------------------------------------------------------- */ 307 /* Horizontal Checking. */ 308 /* -------------------------------------------------------------------- */ 309 if( bDoHorizontalCheck ) 310 { 311 int nNonBlackPixels = 0; 312 313 if( iStart < iEnd ) 314 iDir = 1; 315 else 316 iDir = -1; 317 318 for( i = iStart; i != iEnd; i += iDir ) 319 { 320 int iBand; 321 int bIsNonBlack = FALSE; 322 323 for( iBand = 0; iBand < nBands; iBand++ ) 324 { 325 if( bNearWhite ) 234 326 { 235 bIsNonBlack = TRUE; 236 break; 327 if( (255 - pabyLine[i * nBands + iBand]) > nNearDist ) 328 { 329 bIsNonBlack = TRUE; 330 break; 331 } 237 332 } 238 }239 }240 241 if( bIsNonBlack )242 {243 nNonBlackPixels++;244 245 if( nNonBlackPixels > nMaxNonBlack )246 return;247 } 248 else249 nNonBlackPixels = 0;250 251 for( iBand = 0; iBand < nBands; iBand++ ) 252 {253 if( bNearWhite )254 pabyLine[i * nBands + iBand] = 255;333 else 334 { 335 if( pabyLine[i * nBands + iBand] > nNearDist ) 336 { 337 bIsNonBlack = TRUE; 338 break; 339 } 340 } 341 } 342 343 if( bIsNonBlack ) 344 { 345 nNonBlackPixels++; 346 347 if( nNonBlackPixels > nMaxNonBlack ) 348 return; 349 } 255 350 else 256 pabyLine[i * nBands + iBand] = 0; 257 } 258 } 351 nNonBlackPixels = 0; 352 353 for( iBand = 0; iBand < nBands; iBand++ ) 354 { 355 if( bNearWhite ) 356 pabyLine[i * nBands + iBand] = 255; 357 else 358 pabyLine[i * nBands + iBand] = 0; 359 } 360 } 361 } 362 259 363 }
