2008-10-31 3 views
4

파일에서 비트 맵 이미지를로드하고있었습니다. 이미지를 다른 파일에 저장하려고하면 "일반 오류가 GDI +에서 발생했습니다"라는 오류가 발생합니다. 파일이 이미지 객체에 의해 잠겨 있기 때문입니다.GDI +를 사용하여 수정 된 이미지를 원본 파일에 저장

그래, Image.Clone 함수를 호출 해 보았습니다. 여전히 파일을 잠급니다.

hmm. 다음으로 FileStream에서 비트 맵 이미지를로드하고 GDI +가 파일을 잠그지 않도록 메모리에 이미지를로드합니다. 이 예외는 Image.GetThumbnailImage 메서드를 사용하여 축소판을 생성해야 메모리 예외가 발생하는 것을 제외하고는 훌륭하게 작동합니다. 분명히 스트림을 열어이 예외를 막을 수 있도록해야하지만 스트림을 열린 상태로 유지하면 파일이 잠긴 상태로 유지됩니다.

그렇게 좋지는 않습니다. 결국 파일 사본을 만들었습니다. 이제 파일 버전이 2 개 있습니다. 1 C# 프로그램에서 잠그고 조작 할 수 있습니다. 이 원본 파일은 잠금을 해제 한 상태로 수정 내용을 저장할 수 있습니다. 이것은 변경을 취소 한 파일의 사본을 조작하고 있기 때문에 변경 사항을 저장 한 후에도 되돌릴 수있는 보너스입니다.

두 가지 버전의 이미지 파일을 갖지 않고도이 작업을 수행하는 더 좋은 방법이 있습니다. 어떤 아이디어?

답변

2

나는 그 이후로 파일을 잠그지 않고 이미지를 복제하는 다른 방법을 발견했다. Bob Powell has it all plus more GDI resources.

 //open the file 
     Image i = Image.FromFile(path); 

     //create temporary 
     Image t=new Bitmap(i.Width,i.Height); 

     //get graphics 
     Graphics g=Graphics.FromImage(t); 

     //copy original 
     g.DrawImage(i,0,0); 

     //close original 
     i.Dispose(); 

     //Can now save 
     t.Save(path) 
2

글쎄, 당신이 물어 보는 다른 방법을 찾고 있다면, 나는 MemoryStream을 만들고, 거기에 FileStream을 읽어 들이고, 그 스트림으로부터 이미지를로드해야한다고 생각한다.

var stream = new FileStream("original-image", FileMode.Open); 
var bufr = new byte[stream.Length]; 
stream.Read(bufr, 0, (int)stream.Length); 
stream.Dispose(); 

var memstream = new MemoryStream(bufr); 
var image = Image.FromStream(memstream); 

또는 그 정도면 더 예쁘다.

그 문제를 해결하는 방법이든 아니든, 나는 잘 모릅니다. :) 나는 비슷한 문제를 겪어서 이렇게 고쳐 다녔다.

+0

:-) 작업 : 그래서 이런 짓을. 그 일을 했어. Ty – Crippeoblade

+0

한 번 완료되면 이미지와 memorystream을 모두 처분해야한다고 생각할 수 있습니까? 이미지 만 폐기해도 메모리 스트림은 계속 남겨 둡니까? – Crippeoblade

0

나는 비슷한 문제가있었습니다. 그러나 저는 이미지를 비트 맵 파일로 저장한다는 것을 알고있었습니다.

public void SaveHeightmap(string path) 
    { 
     if (File.Exists(path)) 
     { 
      Bitmap bitmap = new Bitmap(image); //create bitmap from image 
      image.Dispose(); //delete image, so the file 

      bitmap.Save(path); //save bitmap 

      image = (Image) bitmap; //recreate image from bitmap 
     } 
     else 
      //... 
    } 

물론, 가장 좋은 방법을하지 이잖아,하지만이 최고

관련 문제