2014-02-07 2 views
0

특정 파일 이름 마스크 (*.tif)와 일치하는 폴더의 모든 이미지를로드하고 있습니다. 한 번에 하나씩 이미지의 일부분을 가져 와서 출력 이미지에 넣고 그 옆에 어떤 파일이 왔는지 레이블을 붙이려면 DrawString입니다. 출력 이미지를 저장할 때 가끔 일반 GDI + 오류가 발생합니다.이미지를 생성 할 때 일반 GDI +?

Rectangle source = new Rectangle(0, 0, 2500, 50); 
Font font = new Font("Arial", 12); 
String filename = new DirectoryInfo(dir).Name; 
Rectangle divider = new Rectangle(0, 50, 2900, 5); 
Brush lightgray = new SolidBrush(Color.FromArgb(235, 235, 235)); 

Console.WriteLine("Looking in \"" + dir + "\" for \"" + mask + "\""); 

List<string> files = Directory.EnumerateFiles(dir, mask).ToList(); 
using (Bitmap output = new Bitmap(2900, (source.Height + divider.Height) * (files.Count + 1))) 
{ 
    using (Graphics g = Graphics.FromImage(output)) 
    { 
     g.FillRectangle(Brushes.White, 0, 0, output.Width, output.Height); 
     Rectangle target = new Rectangle(new Point(), source.Size); 
     foreach (string file in files) 
     { 
      try 
      { 
       using (Bitmap cur = (Bitmap)Bitmap.FromFile(file)) 
       { 
        g.DrawImage(cur, target, source, GraphicsUnit.Pixel); 
       } 
      } 
      catch 
      { 
       Point p1 = target.Location; 
       p1.Offset(3, 3); 
       g.DrawString("Not an Image File", font, Brushes.Black, p1); 
      } 
      finally 
      { 
       string name = Path.GetFileName(file); 
       g.DrawString(name, font, Brushes.Black, target.X + target.Width, target.Y + 4); 
       g.FillRectangle(lightgray, divider); 
       divider.Y += source.Height + divider.Height; 
       target.Y += source.Height + divider.Height; 
      } 
     } 
     Point p2 = target.Location; 
     p2.Offset(3, 3); 
     String type = "images"; 
     if (mask == "*") type = "files"; 
     if (files.Count == 1) type = type.Substring(0, type.Length - 1); 
     g.DrawString("Processed " + files.Count + " " + type, font, Brushes.Black, p2); 
    } 
    output.Save(filename + ".png", ImageFormat.Png);// GDI+ Error here 
} 

나는 특정 이미지에 대한 큰 이미지의 수천을 검색하는 데 문제가 있습니다. 생성 된 영역이 각 이미지의 상단에 있는데이 프로그램을 축적하여 한 곳에서 모든 파일의 해당 영역을 쉽게 찾을 수 있습니다. 앱을 하나의 폴더로 지정하면 작동하지만 다른 폴더를 가리키면 저장하지 않고 일반 GDI + 오류를 저장합니다. 이 원인은 무엇입니까?

출력 이미지의 크기가 될 수 있습니까? 나는 내 output 비트 맵을 만들 때 비트 맵의 ​​생성자에서 오류를 던지고 있기 때문에 일부 폴더에 대해서는 100 % 확신하지 못했습니다. 크기 문제처럼 보였습니다. 생성자가 생성 할 수 있다면 상상할 수 있습니다. 저장하지 않아도됩니까?

답변

1

이미지를 저장하려면 메모리를 인코딩하는 데 사용되므로 이미지를 만드는 데 더 많은 메모리가 필요합니다. 이미지가 너무 커서 png 프로세서가 인코딩 할 가능성이 완전히 있습니다. 비트 맵으로 저장해보십시오. 비트 맵으로 작동하는지 확인하십시오.

+0

비트 맵으로 저장하는 데 효과적입니다. 750MB 이하의 비트 맵이지만. –

+0

그러면 메모리 문제 일 가능성이 큽니다. 여러 PNG로 일괄 처리하여 png 제한을 해결할 수 있습니다. 이전 png 파일을 언로드했는지 확인하십시오 (새 파일을 만들기 전에'.dispose '). –

+0

PNG는 실제로 요구 사항이 아니며 단지 기본 설정입니다. 나는 그것을 BMP에 맡길 것이다. –

관련 문제