2014-03-03 1 views
13
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 

using (MemoryStream allFrameStream = new MemoryStream()) 
{ 
    foreach (BitmapFrame frame in decoder.Frames) 
    { 
     using (MemoryStream ms= new MemoryStream()) 
     { 
      JpegBitmapEncoder enc = new JpegBitmapEncoder(); 
      enc.Frames.Add(BitmapFrame.Create(frame)); 
      enc.Save(ms); 
      ms.CopyTo(allFrameStream); 
     } 
    } 

    Document documentPDF = new Document(); 
    PdfWriter writer = PdfWriter.GetInstance(documentPDF, allFrameStream); 
} 

항상 allFrameStream의 Length=0입니다. 그러나 반복 할 때마다 나는 ms.Length=989548을 볼 수있었습니다. 내 코드의 오류는 무엇입니까? 왜 ms.CopyTo(allFrameStream)가 작동하지 않습니까?MemoryStream.CopyTo Not working

+1

어디에서 allFrameStream.Length를보고 있습니까? 표시 한 코드는 복사중인 스트림을 사용하지 않습니다. –

+0

@JonSkeet, 이후 각 루프에 대해. 내가'PdfWriter.GetInstance'에서 볼 때, 빠른 시계 창에서 allFrameStream.Length = 0을 보았습니다. – Billa

+0

@JonSkeet, 기본적으로 iTextSharp를 사용하여 여러 페이지의 TIFF 이미지와 표지를 읽으려고합니다. – Billa

답변

6

PDF로 작성하기 바로 전에 allFrameStream.Position = 0;을 실행 해보십시오. 당신이 그것을 기입 한 후 0 ms

30

재설정 Position :

enc.Save(ms); 
ms.Position = 0; 
ms.CopyTo(allFrameStream); 

복사

Stream.CopyTo에서이 ms에 쓰기 한 후 현재의 스트림

+0

고맙게도 작동합니다. – Billa

+0

어떻게 이런 일이 생깁니 까? 왜 CopyTo는 ms.position = 0!을 포함하지 않습니까? –

+0

@JpHouten 그것이 스트림의 작동 방식입니다. 모든 읽기 및 쓰기는 현재 위치에서부터 시작됩니다. 물론 몇 가지 예외가 있습니다. 예를 들어 [ToArray()] (https://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray (v = vs.110) .aspx)는 현재 위치에 관계없이 작동합니다. – dkozl

4

의 현재 위치에서 시작 ms의 위치는 끝입니다. 스트림의 시작 부분을 찾아야합니다 (예 : 로 : 그 ms.CopyTo

ms.Seek(0,System.IO.SeekOrigin.Begin); 

가 제대로 작동합니다.