Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove surrounding whitespace from an image

I have a block of product images we received from a customer. Each product image is a picture of something and it was taken with a white background. I would like to crop all the surrounding parts of the image but leave only the product in the middle. Is this possible?

As an example: [http://www.5dnet.de/media/catalog/product/d/r/dress_shoes_5.jpg][1]

I don't want all white pixels removed, however I do want the image cropped so that the top-most row of pixels contains one non-white pixel, the left-most vertical row of pixels contains one non-white pixel, bottom-most horizontal row of pixels contains one non-white pixel, etc.

Code in C# or VB.net would be appreciated.

like image 343
Kyle B. Avatar asked Oct 29 '08 19:10

Kyle B.


People also ask

How do I remove white space from a PNG?

1 Correct answer Open the png in Photoshop use the magic wand to select the white, delete it and save the document as a png without the white.

How do I get rid of the white space around an image in HTML?

HTML. Line Height Property: The CSS line-height-property can be used to set the height of the line, whose value is set to normal, by default. By setting the height of the container at 0%, the white space can be removed.


1 Answers

I found I had to adjust Dmitri's answer to ensure it works with images that don't actually need cropping (either horizontally, vertically or both)...

    public static Bitmap Crop(Bitmap bmp)     {         int w = bmp.Width;         int h = bmp.Height;          Func<int, bool> allWhiteRow = row =>         {             for (int i = 0; i < w; ++i)                 if (bmp.GetPixel(i, row).R != 255)                     return false;             return true;         };          Func<int, bool> allWhiteColumn = col =>         {             for (int i = 0; i < h; ++i)                 if (bmp.GetPixel(col, i).R != 255)                     return false;             return true;         };          int topmost = 0;         for (int row = 0; row < h; ++row)         {             if (allWhiteRow(row))                 topmost = row;             else break;         }          int bottommost = 0;         for (int row = h - 1; row >= 0; --row)         {             if (allWhiteRow(row))                 bottommost = row;             else break;         }          int leftmost = 0, rightmost = 0;         for (int col = 0; col < w; ++col)         {             if (allWhiteColumn(col))                 leftmost = col;             else                 break;         }          for (int col = w - 1; col >= 0; --col)         {             if (allWhiteColumn(col))                 rightmost = col;             else                 break;         }          if (rightmost == 0) rightmost = w; // As reached left         if (bottommost == 0) bottommost = h; // As reached top.          int croppedWidth = rightmost - leftmost;         int croppedHeight = bottommost - topmost;          if (croppedWidth == 0) // No border on left or right         {             leftmost = 0;             croppedWidth = w;         }          if (croppedHeight == 0) // No border on top or bottom         {             topmost = 0;             croppedHeight = h;         }          try         {             var target = new Bitmap(croppedWidth, croppedHeight);             using (Graphics g = Graphics.FromImage(target))             {                 g.DrawImage(bmp,                   new RectangleF(0, 0, croppedWidth, croppedHeight),                   new RectangleF(leftmost, topmost, croppedWidth, croppedHeight),                   GraphicsUnit.Pixel);             }             return target;         }         catch (Exception ex)         {             throw new Exception(               string.Format("Values are topmost={0} btm={1} left={2} right={3} croppedWidth={4} croppedHeight={5}", topmost, bottommost, leftmost, rightmost, croppedWidth, croppedHeight),               ex);         }     } 
like image 143
Darren Avatar answered Sep 25 '22 03:09

Darren