Development Tip

파일에서 이미지를 연 다음 잠금을 해제 하시겠습니까?

yourdevel 2020. 11. 10. 22:24
반응형

파일에서 이미지를 연 다음 잠금을 해제 하시겠습니까?


다음 코드 줄을 사용하여 Image파일에서 를 엽니 다 .

pictureBox1.Image = Image.FromFile("test.png");

파일을 잠그고, 이미지를 메모리에로드하고, 메모리에 pictureBox1.Image복사본을 설정 하고, 잠금을 해제 할 것으로 예상합니다 . 실제로, 잠금 내가 때까지 사라지지 않을 것 Dispose()Image메모리에. 나는에서 파일을 제거 할 때까지 나는 더 이상 사용하고있는 하드 드라이브에있는 파일에 대한 잠금을 해제 할 수 없습니다 기억 나는 것을 하고 사용.
Microsoft의 사이트는 C # 레이블이 붙은 기사에서 언급하지만 솔루션은 Visual Basic으로 작성되어 나에게 쓸모가 없습니다.

요약하면에 pictureBox1.Image저장된 이미지 로 설정 "test.png"한 다음 사용자가 편집하거나 삭제하도록하고 싶습니다 "test.png".


스트림에 대한 접근 방식 이 올바르지 않습니다 .

여기를 참조하십시오 https://stackoverflow.com/a/8701748/355264

위 링크의 올바른 코드 :

Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
    img = new Bitmap(bmpTemp);
}

또는 더 좋은 방법은 using문을 사용하는 것입니다 (아래 코드는 사일 론의 [삭제] 게시물에서 복사 한 것입니다). 이렇게 Image.FromStream하면 예외가 발생하는 경우 스트림이 즉시 닫힙니다.

using (FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = Image.FromStream(stream);
}

스트림을 사용하여 이미지를 읽은 다음 스트림을 닫을 수도 있습니다.

FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(stream);
stream.Close();

내가 찾은 가장 쉬운 방법은 소스 (파일 경로)를 포함하는 개체를 고정하는 것입니다. 이미지를 포함 할 수있는 모든 컨트롤은 null이 아닌 경우 가리키는 파일을 잠그는 .Source가있는 것처럼 보입니다.

이제 트릭은 이미지 컨트롤을 "읽기 전용"상태로 변경 한 다음 파일 잠금을 해제하는 것입니다.

내 솔루션 :

    private Image CreatePreviewImage()
    {
        Image ReportImage = new Image();
        Uri path = new Uri(@"C:\Folder\Image1.png");
        if (File.Exists(path.OriginalString))
        {
            ReportImage.Name = "Report1";
            ReportImage.Source = LoadImageFromFile(path);
        }
        return ReportImage;
    }

    public ImageSource LoadImageFromFile(Uri path)
    {
        BitmapImage bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.UriSource = path;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        bitmap.DecodePixelWidth = 900;
        bitmap.EndInit();
        bitmap.Freeze(); //This is the magic line that releases/unlocks the file.
        return bitmap;
    }

열린 이야기, 읽기 및 릴리스

    StreamReader streamReader = new StreamReader("picture.png");
    Bitmap tmpBitmap = (Bitmap)Bitmap.FromStream(streamReader.BaseStream);
    streamReader.Close();
    pictureBox1.Image = tmpBitmap;`
    

참고URL : https://stackoverflow.com/questions/6576341/open-image-from-file-then-release-lock

반응형