2013-09-06 3 views
0
Private Shared Values(4) As Integer 
    Private Shared myImage As Bitmap 
    Private Shared myArea As Rectangle 
    Private Shared ocrImg As Bitmap 
    Private Shared ImgCpy As Bitmap 

    Public Shared Function PrepImage(ByVal filename As String, ByVal savename As String, ByVal filetype As String) As Boolean 
     '// Grab region of image for processing 
     Try 

      Select Case filetype 
       Case "A" 
        Values(0) = 2240 
        Values(1) = 255 
        Values(2) = 40 
        Values(3) = 150 
        Values(4) = 3 
       Case "B" 
        Values(0) = 184 
        Values(1) = 255 
        Values(2) = 85 
        Values(3) = 20 
        Values(4) = 0 
       Case "C" 
        Values(0) = 933 
        Values(1) = 755 
        Values(2) = 270 
        Values(3) = 62 
        Values(4) = 0 
       Case Else 
        Return False 
      End Select 

      myImage = Bitmap.FromFile(filename) 
      ImgCpy = New Bitmap(myImage) 
      myImage.Dispose() 
      myArea = New Rectangle(Values(0), Values(1), Values(2), Values(3)) 
      ocrImg = GetPicturePart(ImgCpy, myArea) 
      ocrImg.RotateFlip(Values(4)) 
      ocrImg.Save(savename, Drawing.Imaging.ImageFormat.Bmp) 
      ocrImg.Dispose() 
      ImgCpy.Dispose() 

이 기능은 내가 그것을 전화를 처음 작동하지만, 실패 번 이상, 때로는 내가 매개 변수를 지정하지 예외를 얻을 수가 있지만, 대부분은 내가 메모리 오류의 출력을 얻을 . 결국 이미지를 Nothing으로 설정해야합니까? Dispose가 사용하고있는 모든 리소스를 릴리스하겠습니까? 다음하지만 여전히 문제를 가지고,이 가져 오기 picturepart 기능을 사용하지 않지만, 여기뿐만 아니라 같이 이미지 저장 주위에

나는 ... 모든 응답들에 대한

Private Shared Function GetPicturePart(ByVal SourceImage As Image, ByVal Region As Rectangle) As Bitmap 
     Dim ImagePart As Bitmap = New Bitmap(Region.Width, Region.Height) 
     Using G As Graphics = Graphics.FromImage(ImagePart) 
      Dim TargetRect As Rectangle = New Rectangle(0, 0, Region.Width, Region.Height) 
      Dim SourceRect As Rectangle = Region 
      G.DrawImage(SourceImage, TargetRect, SourceRect, GraphicsUnit.Pixel) 
     End Using 
     Return ImagePart 
    End Function 

Dim myImg As New Bitmap(filename) 
      Dim MyArea As New Rectangle(Values(0), Values(1), Values(2), Values(3)) 
      Dim myFormat As PixelFormat = myImg.PixelFormat 
      Dim myOCR As Bitmap = myImg.Clone(MyArea, myFormat) 
      myImg.Dispose() 
      myImg = Nothing 
      myOCR.RotateFlip(Values(4)) 
      myOCR.Save(savename, Drawing.Imaging.ImageFormat.Bmp) 
      myOCR.Dispose() 
      myOCR = Nothing 
+0

..... 어느 경우

, 난 이미지 작업을 시도하기 전에 몇 초 동안 실을 자고 나도 오류를 재현 할 수 없었습니다 하위 범위에서만 – OneFineDay

+0

코드를 리팩터링했습니다. –

+0

GetPicturePart의 기능은 무엇입니까? 오 .. 나는 새로운 이미지를 돌려 준다고 생각하니? 여기에 코드를 추가해야합니다. – Alan

답변

0

감사의 코드를 리팩토링. 다음은 내가 결정할 수 있었던 것입니다 :

코드를 변경하면 메모리 부족 오류를 제거하는 것처럼 보입니다. 코드의 단계가 적어지고 사용 직후에 이미지를 버리고 아무 것도 설정하지 마십시오.

매개 변수가 올바르지 않은 것은 실제로 다른 부분이 파일에 잠금을 설정하여 프로세스가로드 할 수 있었기 때문입니다. 테스트 폴더에서 프로덕션 캡처 폴더로 복사 및 붙여 넣기를했기 때문에 시스템은 파일을 빨리 가져 와서 시스템이 작업을 완료 할 수 있거나 Windows가 시도하려고했던 엄지 손가락을 생성하려고 시도했기 때문에 추측 할 수 있습니다. 그것, 확실하지 않다. 그들은 그래서 당신은 즉석에서 비트 맵을해야