Подтвердить что ты не робот

MemoryStream.CopyTo Не работает

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) не работает?

4b9b3361

Ответ 1

Reset Position от ms до 0 после его заполнения:

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

Из Stream.CopyTo

Копирование начинается с текущей позиции в текущем потоке

Ответ 2

Попробуйте выполнить allFrameStream.Position = 0; непосредственно перед записью в PDF.

Ответ 3

После записи в ms позиция ms находится в конце. Вы должны искать начало потока, например. с:

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

После этого ms.CopyTo работает правильно.