2014-08-28 3 views
1

У меня есть одно многостраничное изображение abc.tiff, я должен сделать рисунок на каждой странице и сохранить его как одно многостраничное изображение в некотором D:\xyz месте.Как сделать многостраничное изображение из списка изображений

Я использую ниже код для этого:

List<Image> images = new List<Image>(); 
    Bitmap bitmap = (Bitmap)Image.FromFile(@"abc.tiff"); 
    int count = bitmap.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page); 

    for (int idx = 0; idx < count ; idx++) 
    { 

     bitmap.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, idx); 
     // save each frame to a bytestream 
     MemoryStream byteStream = new MemoryStream(); 
     // below 3 lines for drawing something on image... 
     Bitmap tmp = new Bitmap(bitmap, bitmap.Width, bitmap.Height); 
     Graphics g = Graphics.FromImage(tmp); 
     g.DrawRectangle(blackPen, x, y, width, height); 

     tmp.Save(byteStream, System.Drawing.Imaging.ImageFormat.Tiff); 
     tmp.Dispose(); 
     // and finally adding each frame into image list  
     images.Add(Image.FromStream(byteStream)); 
    } 

После этого я хочу сохранить свою модифицированную многостраничный файл на D:\xyz месте.

Не могли бы вы предложить мне, как я могу получить одно многостраничное изображение с List<Image> изображений?

+0

Вы решили проблему? – TaW

ответ

1

Это взято довольно много непосредственно из Bob Powell:

Предполагая

string saveName = "c:\\myMultiPage.tiff" // your target path 
List<Image> imgList = new List<Image>();  // your list of images 

Когда список заполняется вы можете сделать это:

using System.Drawing.Imaging; 
// .. 

System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.SaveFlag; 

// create one master bitmap from the first image 
Bitmap master = new Bitmap(imgList[0]); 
ImageCodecInfo info = null; 

// lets hope we find a tiff encoder! 
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders()) 
    if (ice.MimeType == "image/tiff") info = ice; 

// we'll always need only one parameter 
EncoderParameters ep = new EncoderParameters(1); 
ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame); 

// save the master with our parameter, announcing it will be 'MultiFrame' 
master.Save(saveName, info, ep); 

// now change the parameter to 'FramePage'.. 
ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage); 

// ..and add-save the other images into the master file 
for (int i = 1; i < imgList.Count; i++) 
    master.SaveAdd(imgList[i], ep); 

// finally set the parameter to 'Flush' and do it.. 
ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush); 
master.SaveAdd(ep); 

Все похвалы Боб Пауэлл !!

Смежные вопросы