2016-12-17 2 views
-2

Как я могу обрезать определенную область из изображения, в то время как выбранная область не является идеальным прямоугольником? В этом image, как я могу обрезать область, отличную от красной, на разные части?Обрезать изображение, когда область обрезки не является прямоугольником

+0

Изображение может быть только прямоугольным. Глядя на изображение, я понятия не имею, что вы хотите. Может быть, [что-то вроде этого?] (Http://stackoverflow.com/questions/30954503/how-to-crop-a-polygonal-area-from-an-image -in-a-winform-picturebox/30954946? s = 4 | 1.5201 # 30954946) – TaW

+0

Я думаю, это зависит от того, что вы подразумеваете под «обрезкой». Если это изображение ARGB (с альфа/прозрачностью), и вы хотите сделать пиксели определенного цвета, например, прозрачными, вы можете сделать Bitmap.GetPixel() и проверить цвет, который вы хотите скрыть, и настроить альфа для этого пикселя, я полагаю. –

+0

Сделайте себе одолжение и прочитайте книгу об основах обработки изображений или, по крайней мере, некоторых учебных пособиях ... термины, которые могут помочь: aoi, roi, mask – Piglet

ответ

0

Чтобы изолировать непрямоугольные области изображения и/или области на основе цвета, мощный метод заключается в использовании свойства alpha/transparent для 32-битных изображений. Например, изображение слева - это оригинальное 24-битное изображение (без альфы), а справа - результат преобразования этого изображения в 32 бит и установка альфа = 0 для всех пикселей, которые являются белыми или красными в оригинальное изображение. Эффективно это может сделать ваше изображение не прямоугольным.

enter image description here

Код для этого достаточно просто. В приведенном ниже методе используется входной битмап (24 бит), генерируется пустое 32-битное изображение и передается все пиксели от источника до адресата, устанавливая альфа-значение 0 для всех белых или красных пикселей.

public Bitmap ModifyAlpha(Bitmap bmap) 
    { 
     Bitmap bmap32 = new Bitmap(bmap.Width, bmap.Height, PixelFormat.Format32bppArgb); 

     Color theColor = new Color(); 
     Color newColor = new Color(); 

     for (int i = 0; i < bmap.Width; i++) 
     { 
      for (int j = 0; j < bmap.Height; j++) 
      { 
       // Get the color of the pixel at (i,j) 
       theColor = bmap.GetPixel(i, j); 

       // Set the pixel color/range you want to make transparent 
       if ((theColor.R > 250 && theColor.G > 250 && theColor.B > 250) || 
        (theColor.R > 250)) 
       { 
        newColor = Color.FromArgb(0, theColor.R, theColor.G, theColor.B); 
        bmap32.SetPixel(i, j, newColor); 
       } else 
       { 
        bmap32.SetPixel(i, j, theColor); 
       } 
      } 
     } 
     return bmap32; 
    } 
Смежные вопросы