2012-01-25 4 views
0

이미지 행 또는 열을 검사하고 모든 흰색 픽셀이 포함 된 경우 해당 행 또는 열을 잘라내려고합니다. 이유를 모르겠지만이 코드 조각을 실행할 때 TrimLeft의 img.Width는 1이며, 그 중 하나에서 1을 뺍니다. 실제 이미지 너비는 175입니다. 결국 ArgumentException이 생깁니다. 나는 오른쪽면을 잘라내 기와 비슷한 방법을 사용하고 있습니다. 이 현저하게 비효율적 일 것 같은C# 비트 맵 어려움

class ImageHandler 
{ 

    public Bitmap img; 
    public List<int[]> pixels = new List<int[]>(); 

    public ImageHandler(String path) 
    { 
     img = new Bitmap(path); 
     GetPixels(); 
    } 

    public void TrimLeft() 
    { 
     while (CheckColIfWhite(0, 0)) 
     { 
      Rectangle cropBox = new Rectangle(1, 0, (img.Width-1), img.Height); 
      Bitmap cropdImg = CropImage(img, cropBox); 
      img = cropdImg; 
     } 
    } 

    public bool CheckColIfWhite(int colx, int starty) 
    { 
     bool allPixelsWhite = false; 
     int whitePixels = 0; 

     for (int y = starty; y < img.Height; y++) 
     { 
      if (pixels[y][colx] >= 200) { whitePixels++; } 
      else { return false; } 
      if (whitePixels == img.Height) { allPixelsWhite = true; } 
     } 
     return allPixelsWhite; 
    } 

    public void GetPixels() 
    { 
     for (int y = 0; y < img.Height; y++) 
     { 
      int[] line = new int[img.Width]; 
      for (int x = 0; x < img.Width; x++) 
      { 
       line[x] = (int) img.GetPixel(x, y).R; 
      } 
      pixels.Add(line); 
     } 
    } 

    public Bitmap CropImage(Bitmap tImg, Rectangle area) 
    { 
     Bitmap bmp = new Bitmap(tImg); 
     Bitmap bmpCrop = bmp.Clone(area, bmp.PixelFormat); 
     return bmpCrop; 
    } 
} 

답변

1

귀하의 방법이 보인다 - 이미지가 175 픽셀 (폭), 그리고 완전히 흰색 인 경우, 당신은 (아마도)하기 전에, 그것의 175 개 복사본을 만들가는를 만들려고 할 때 실패하고 0 픽셀 너비의 이미지.

흰색이 아닌 열을 찾을 때까지 차례대로 각 열을 검사 한 다음 그 때 한 번만 자르기를 수행하십시오. 테스트되지 않은 코드는 잘하면 분명 다른 변화 :

public Bitmap CropImage (Bitmap image) 
{ 
    int top = 0; 
    int bottom = image.Height-1; 
    int left = 0; 
    int right = image.Width-1; 
    while(left < right && CheckColIfWhite(image,left)) 
     left++; 
    if(left==right) return null; //Entirely white 
    while(CheckColIfWhite(image,right)) //Because left stopped, we know right will also 
     right--; 
    while(CheckRowIfWhite(image,top)) 
     top++; 
    while(CheckRowIfWhite(image,bottom)) 
     bottom--; 
    return CropImage(image,new Rectangle(left,top,right-left+1,bottom-top+1)); 
} 

(예 : 내가 지금 주위의 이미지를 전달하고있어, 나는 또한 이미지를 촬영하고, 하나 개의 매개 변수가 항상 고정되어 있다고 가정 CheckColIfWhiteCheckRowIfWhite을 수정 한 또한 0)


에서하지 왜 미리 픽셀 어레이를 추출하고, 그래서 내 놓겠 확인도 CheckColIfWhite을 재 작성 :

public bool CheckColIfWhite(Bitmap image,int colx) 
{ 
    for (int y = 0; y < image.Height; y++) 
    { 
     if (image.GetPixel(colx,y).R < 200) 
      return false; 
    } 
    return true; 
} 
+0

이 V이었다 에리 도움이 감사합니다. 내 방법이 비효율적이라는 것을 알았습니다. 더 좋은 방법을 알지 못했습니다. 원래 이미지의 모든 픽셀을 가져 와서 파일을 여러 번 읽지 않고 저장했습니다. – sjensen85