@@ -360,8 +360,8 @@ Returns:
360360 where с is the number of channels in the image. 
361361 Dense data layout is guaranteed. 
362362+/ 
363- Slice!(ubyte *, 3) movingWindowByChannel 
364- (Slice!(Universal, [3], ubyte* ) image, size_t nr, size_t nc, ubyte delegate(Slice!(Universal, [2], ubyte*)) filter ) 
363+ Slice!(C *, 3) movingWindowByChannel(alias filter, C)  
364+ (Slice!(C*, 3, Universal ) image, size_t nr, size_t nc) 
365365{ 
366366 // 0. 3D 
367367 // The last dimension represents the color channel. 
@@ -374,10 +374,12 @@ Slice!(ubyte*, 3) movingWindowByChannel
374374 .windows(nr, nc) 
375375 // 3. 5D 
376376 // Unpacks the windows. 
377-  .unpack 
378-  .transposed!(0, 1, 4) 
377+  .unpack.unpack 
379378 // 4. 5D 
380379 // Brings the color channel dimension to the third position. 
380+  .transposed!(0, 1, 4) 
381+  // 5. 3D Composed of 2D 
382+  // Packs the last two dimensions. 
381383 .pack!2 
382384 // 2D to pixel lazy conversion. 
383385 .map!filter 
@@ -397,12 +399,15 @@ Params:
397399Returns: 
398400 median value over the range `r` 
399401+/ 
400- T median(Range,  T)(Slice!(Universal, [2], Range ) sl, T[] buf) 
402+ T median(Iterator, SliceKind kind,  T)(Slice!(Iterator, 2, kind ) sl, T[] buf) 
401403{ 
402404 import std.algorithm.sorting : topN; 
403405 // copy sl to the buffer 
404406 auto retPtr = reduce!( 
405-  (ptr, elem) { *ptr = elem; return ptr + 1;} )(buf.ptr, sl); 
407+  (ptr, elem) { 
408+  *ptr = elem; 
409+  return ptr + 1; 
410+  } )(buf.ptr, sl); 
406411 auto n = retPtr - buf.ptr; 
407412 buf[0 .. n].topN(n / 2); 
408413 return buf[n / 2]; 
@@ -414,9 +419,9 @@ The `main` function:
414419------- 
415420void main(string[] args) 
416421{ 
417-  import std.conv  : to; 
418-  import std.getopt  : getopt, defaultGetoptPrinter; 
419-  import std.path  : stripExtension; 
422+  import std.conv: to; 
423+  import std.getopt: getopt, defaultGetoptPrinter; 
424+  import std.path: stripExtension; 
420425
421426 uint nr, nc, def = 3; 
422427 auto helpInformation = args.getopt( 
@@ -434,6 +439,12 @@ void main(string[] args)
434439
435440 auto buf = new ubyte[nr * nc]; 
436441
442+  if (args.length == 1) 
443+  { 
444+  import std.stdio: writeln; 
445+  writeln("No input file given"); 
446+  } 
447+ 
437448 foreach (name; args[1 .. $]) 
438449 { 
439450 import imageformats; // can be found at code.dlang.org 
@@ -442,6 +453,7 @@ void main(string[] args)
442453
443454 auto ret = image.pixels 
444455 .sliced(cast(size_t)image.h, cast(size_t)image.w, cast(size_t)image.c) 
456+  .universal 
445457 .movingWindowByChannel 
446458 !(window => median(window, buf)) 
447459 (nr, nc); 
@@ -450,7 +462,7 @@ void main(string[] args)
450462 name.stripExtension ~ "_filtered.png", 
451463 ret.length!1, 
452464 ret.length!0, 
453-  (& ret[0, 0, 0])[0 .. ret.elementCount] ); 
465+  ret.field ); 
454466 } 
455467} 
456468------- 
0 commit comments