Advertisement
uwekeim

Crop an image in memory

Aug 16th, 2011
1,628
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.90 KB | None | 0 0
  1. // This is related to http://stackoverflow.com/questions/7083853/simple-algorithm-to-crop-empty-borders-from-an-image-by-code
  2. public static Rectangle MeasureImageCrop(Bitmap image)
  3. {
  4.     // GDI+ still lies to us - the return format is BGR, NOT RGB.
  5.     var bmData = image.LockBits(
  6.         new Rectangle(0, 0, image.Width, image.Height),
  7.         ImageLockMode.ReadWrite,
  8.         PixelFormat.Format24bppRgb);
  9.  
  10.     var stride = bmData.Stride;
  11.     var scan0 = bmData.Scan0;
  12.  
  13.     var cutLeft = 0;
  14.     var cutRight = 0;
  15.     var cutTop = 0;
  16.     var cutBottom = 0;
  17.  
  18.     const int step = 1;
  19.  
  20.     unsafe
  21.     {
  22.         var p = (byte*)(void*)scan0;
  23.  
  24.         var refBlue = p[0];
  25.         var refGreen = p[1];
  26.         var refRed = p[2];
  27.  
  28.         // --
  29.         // Top.
  30.  
  31.         var wantBreak = false;
  32.         for (var y = 0; y < image.Height; y += step)
  33.         {
  34.             p = ((byte*)(void*)scan0) + stride * y;
  35.  
  36.             for (var x = 0; x < image.Width; x += step)
  37.             {
  38.                 var blue = p[0];
  39.                 var green = p[1];
  40.                 var red = p[2];
  41.  
  42.                 if (blue != refBlue || green != refGreen || red != refRed)
  43.                 {
  44.                     wantBreak = true;
  45.                     break;
  46.                 }
  47.  
  48.                 p += 3 * step;
  49.             }
  50.  
  51.             if (wantBreak)
  52.             {
  53.                 break;
  54.             }
  55.  
  56.             cutTop += step;
  57.         }
  58.  
  59.         // --
  60.         // Bottom.
  61.  
  62.         wantBreak = false;
  63.         for (var y = image.Height - 1; y >= 0; y -= step)
  64.         {
  65.             p = ((byte*)(void*)scan0) + stride * y;
  66.  
  67.             for (var x = 0; x < image.Width; x += step)
  68.             {
  69.                 var blue = p[0];
  70.                 var green = p[1];
  71.                 var red = p[2];
  72.  
  73.                 if (blue != refBlue || green != refGreen || red != refRed)
  74.                 {
  75.                     wantBreak = true;
  76.                     break;
  77.                 }
  78.  
  79.                 p += 3 * step;
  80.             }
  81.  
  82.             if (wantBreak)
  83.             {
  84.                 break;
  85.             }
  86.  
  87.             cutBottom += step;
  88.         }
  89.  
  90.         // --
  91.         // Left.
  92.  
  93.         p = (byte*)(void*)scan0;
  94.  
  95.         wantBreak = false;
  96.         for (var x = 0; x < image.Width; x += step)
  97.         {
  98.             for (var y = 0; y < image.Height; y += step)
  99.             {
  100.                 var blue = p[0];
  101.                 var green = p[1];
  102.                 var red = p[2];
  103.  
  104.                 if (blue != refBlue || green != refGreen || red != refRed)
  105.                 {
  106.                     wantBreak = true;
  107.                     break;
  108.                 }
  109.  
  110.                 p += stride * step;
  111.             }
  112.  
  113.             if (wantBreak)
  114.             {
  115.                 break;
  116.             }
  117.  
  118.             cutLeft += step;
  119.  
  120.             p -= stride * image.Height;
  121.             p += 3 * step;
  122.         }
  123.  
  124.         // --
  125.         // Right.
  126.  
  127.         p = (byte*)(void*)scan0;
  128.  
  129.         p += (image.Width - 1) * 3;
  130.  
  131.         wantBreak = false;
  132.         for (var x = image.Width - 1; x >= 0; x -= step)
  133.         {
  134.             for (var y = 0; y < image.Height; y += step)
  135.             {
  136.                 var blue = p[0];
  137.                 var green = p[1];
  138.                 var red = p[2];
  139.  
  140.                 if (blue != refBlue || green != refGreen || red != refRed)
  141.                 {
  142.                     wantBreak = true;
  143.                     break;
  144.                 }
  145.  
  146.                 p += stride * step;
  147.             }
  148.  
  149.             if (wantBreak)
  150.             {
  151.                 break;
  152.             }
  153.  
  154.             cutRight += step;
  155.  
  156.             p -= stride * image.Height;
  157.             p -= 3 * step;
  158.         }
  159.     }
  160.  
  161.     // --
  162.  
  163.     image.UnlockBits(bmData);
  164.  
  165.     return new Rectangle(
  166.         cutLeft,
  167.         cutTop,
  168.         image.Width - cutRight - cutLeft,
  169.         image.Height - cutBottom - cutTop);
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement