2014-01-10 4 views
2

편집 :이 같은 인코더 PARAMS을 만들어 또 다른 예를 발견하고 나는 befoer과 동일한 오류가 발생합니다 :TIFF 파일을 병합 할 인코딩 매개 변수를 사용하여

  Dim info As ImageCodecInfo = Nothing 
      Dim ice As ImageCodecInfo 
      For Each ice In ImageCodecInfo.GetImageEncoders() 

       If ice.MimeType = "image/tiff" Then 
        info = ice 

       End If 

      Next ice 'use the save encoder 
      Dim enc As Encoder = Encoder.SaveFlag 
      Dim ep As New EncoderParameters(1) 
      ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.MultiFrame)) 

원래의 게시물을 "A 일반 오류 GDI에서 발생 +"

VB.Net, 비주얼 스튜디오 2012, 닷넷 4.5

나는, 쓰기 빌려, 또는 하나의 TIFF 파일로 여러 TIFF 파일을 병합하는 코드를 훔치려하고있다. 모든 예제는 내가 쓰기를하든, 아니면 어떤 곳에서 가져올 지와 상관없이 "GDI +에서 일반 오류가 발생했습니다."라는 예외와 함께 동일한 줄에서 실패합니다. 문제의 원인이되는 행은 DestinationImage.SaveAdd (img, imagePararms)입니다. 일반 오류에 대한 일반 오류 메시지로 진행하기에 충분하지 않습니다. 아무도 이것을 경험 한 적이 있습니까? 이 코드에 대한 해결책을 찾을 수 없습니다 않았지만

그렉

Public Sub mergeTiffPages(str_DestinationPath As String, sourceFiles As String()) 

    Dim codec As System.Drawing.Imaging.ImageCodecInfo = Nothing 

    For Each cCodec As System.Drawing.Imaging.ImageCodecInfo In System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders() 
     If cCodec.CodecName = "Built-in TIFF Codec" Then 
      codec = cCodec 
     End If 
    Next 

    Try 

     Dim imagePararms As New System.Drawing.Imaging.EncoderParameters(1) 
     imagePararms.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, CLng(System.Drawing.Imaging.EncoderValue.MultiFrame)) 

     If sourceFiles.Length = 1 Then 

      System.IO.File.Copy(DirectCast(sourceFiles(0), String), str_DestinationPath, True) 
     ElseIf sourceFiles.Length >= 1 Then 
      Dim DestinationImage As System.Drawing.Image = DirectCast(New System.Drawing.Bitmap(DirectCast(sourceFiles(0), String)), System.Drawing.Image) 

      DestinationImage.Save(str_DestinationPath, codec, imagePararms) 

      imagePararms.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, CLng(System.Drawing.Imaging.EncoderValue.FrameDimensionPage)) 


      For i As Integer = 0 To sourceFiles.Length - 2 
       Dim img As System.Drawing.Image = DirectCast(New System.Drawing.Bitmap(DirectCast(sourceFiles(i), String)), System.Drawing.Image) 

       DestinationImage.SaveAdd(img, imagePararms) 
       img.Dispose() 
      Next 

      imagePararms.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, CLng(System.Drawing.Imaging.EncoderValue.Flush)) 
      DestinationImage.SaveAdd(imagePararms) 
      imagePararms.Dispose() 

      DestinationImage.Dispose() 

     End If 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 


End Sub 
+0

그래서 목표는 여러 페이지로 끝나는 것입니까? 나는 CodecName에 의해 ImageCodecInfo를 얻으려고 시도하지 않았지만, MimeType은 "image/tiff"와 동일합니까? –

+0

예, 목표는 단일 페이지 티프의 배열을 전달하고이를 한 파일에 결합하는 것입니다. 나는 'image/tiff'를 확인하지 않았지만 for..each 루프는 결국 "Built-in TIFF Codec"에 부딪칩니다. – user1091524

+0

'image/tiff'이 (가) 없습니다. 모든 코덱은 'Built-in ...'으로 시작합니다. – user1091524

답변

1

나는 작동 코드를 발견했다. JohnH a moderator at http://www.vbdotnetforums.com/이 스레드에 아래 코드를 게시했습니다. http://www.vbdotnetforums.com/graphics-gdi/22113-create-multipage-tiff-loop.html

그것은 저에게 적합합니다. 어떻게 호출했는지 보여주기 위해 맨 위에 몇 줄을 추가했습니다.

그렉

'Example: Combine 4 tiff images in a new file called FinishedTiff.tiff 
'Dim oNewImage As Image 

'oNewImage = Image.FromFile("C:\IRISScan\Week of Jan 6 no SSN_Page_1.tif") 
'SaveAddTiff(oNewImage, "C:\IRISScan\FinishedTiff.tif") 

'oNewImage = Image.FromFile("C:\IRISScan\Week of Jan 6 no SSN_Page_2.tif") 
'SaveAddTiff(oNewImage, "C:\IRISScan\FinishedTiff.tif") 

'oNewImage = Image.FromFile("C:\IRISScan\Document3_Page_1.tif") 
'SaveAddTiff(oNewImage, "C:\IRISScan\FinishedTiff.tif") 

'oNewImage = Image.FromFile("C:\IRISScan\Document3_Page_2.tif") 
'SaveAddTiff(oNewImage, "C:\IRISScan\FinishedTiff.tif") 
Imports System.Drawing.Imaging 

Module modTiff 
' 

Sub SaveAddTiff(ByVal img As Image, ByVal filename As String) 
    If Not IO.File.Exists(filename) Then 
     img.Save(filename, Imaging.ImageFormat.Tiff) 
    Else 
     Dim frames As List(Of Image) = getFrames(filename) 
     frames.Add(img) 
     SaveMultiTiff(frames.ToArray, filename) 
    End If 
    img.Dispose() 
End Sub 

Sub SaveMultiTiff(ByVal frames() As Image, ByVal filename As String) 
    Dim codec As ImageCodecInfo = getTiffCodec() 
    Dim enc As Encoder = Encoder.SaveFlag 
    Dim ep As New EncoderParameters(2) 
    ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.MultiFrame)) 
    ep.Param(1) = New EncoderParameter(Encoder.Compression, CLng(EncoderValue.CompressionNone)) 
    Dim tiff As Image = frames(0) 
    tiff.Save(filename, codec, ep) 
    ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.FrameDimensionPage)) 
    For i As Integer = 1 To frames.Length - 1 
     tiff.SaveAdd(frames(i), ep) 
     frames(i).Dispose() 
    Next 
    ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.Flush)) 
    tiff.SaveAdd(ep) 
    tiff.Dispose() 
End Sub 

Function getTiffCodec() As ImageCodecInfo 
    For Each ice As ImageCodecInfo In ImageCodecInfo.GetImageEncoders() 
     If ice.MimeType = "image/tiff" Then 
      Return ice 
     End If 
    Next 
    Return Nothing 
End Function 

Function getFrames(ByVal filename) As List(Of Image) 
    Dim frames As New List(Of Image) 
    Dim img As Image = Image.FromFile(filename) 
    For i As Integer = 0 To img.GetFrameCount(Imaging.FrameDimension.Page) - 1 
     img.SelectActiveFrame(Imaging.FrameDimension.Page, i) 
     Dim tmp As New Bitmap(img.Width, img.Height) 
     Dim g As Graphics = Graphics.FromImage(tmp) 
     g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality 
     g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic 
     g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality 
     g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality 
     g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit 
     g.DrawImageUnscaled(img, 0, 0) 
     frames.Add(tmp) 
     g.Dispose() 
    Next 
    img.Dispose() 
    Return frames 
End Function 

내가

g.DrawImageUnscaledAndClipped(img, New Rectangle(0, 0, img.Width, img.Height)) 

g.DrawImageUnscaled(img, 0, 0) 

를 교체하고 그것이 분기에 이미지를 축소 할 스케일링 문제를 해결

+0

안녕하세요, 코드를 보내 주셔서 감사합니다. 'SaveMultiTiff'프로 시저를 지나면 페이지가 원래 크기의 4 분의 1로 축소됩니다. 여기서 무슨 일이 일어나고 있는지 아십니까? –

0

엔드 모듈 그것의 ori ginal size

+0

공유 해 주셔서 감사합니다. 나는 그것이 그 해답에 대한 해답이라고 생각하니? (원래 질문에 설명 된 문제는 아닌 것 같습니다) – de1

+0

수정. 방금 계정을 만들었 기 때문에 직접적으로 의견을 말할 수는 없습니다. 미안 해요, 전 여기 새로 왔습니다. – robe1048

관련 문제