문제

나는 그것이 이상하게 들린다는 것을 안다. 하드 디스크에서 메모리 컬렉션으로 이미지 정보 (URL, 이름, 날짜 수정 ...)를 저장하는 사진 갤러리가 있습니다.

문제는 이미지 너비/높이를 해당 컬렉션에 저장하고 싶다는 것입니다. Draw.Image 클래스를 사용하여 각 파일에 대해 얻을 수 있습니다. 그러나 갤러리가 상당히 커질 수 있다는 점을 고려하면 각 파일에 새 이미지 객체를 만들면 성능이 크게 줄어 듭니다.

어떤 아이디어?, 감사합니다

도움이 되었습니까?

해결책

실제로 구성하지 않고 해당 정보를 얻으려면 Image 객체 인스턴스 각 이미지의 경우 각 개별 이미지 파일을 읽고 정보를 추출하는 코드를 작성해야합니다. 확실히 가능하지만 다소 관련이 있습니다. 먼저 파일에 어떤 유형의 이미지 (.BMP, .gif, .png, .jpg 등)를 결정하기 위해 파일의 처음 몇 바이트를 읽는 코드가 필요하며 필요합니다. 특별 코드 지원하는 각 이미지 유형에 대한 정보를 추출합니다.

위의 내용은 전체 이미지를로드하고 관련 데이터를 추출한 다음 이미지를 파괴하는 코드보다 거의 빠르지 만 훨씬 더 빠른 말을 할 수는 없습니다. 실행 시간 절약이 그러한 솔루션에 넣을 시간을 정당화하지 않을 가능성이 상당합니다.

이 프로그램을 작성했는데 첫 번째 컷은 Chrisf가 제안한대로 다음과 같은 글을 쓸 것입니다.

foreach (string filename in ImageFilenames)
{
    using (Bitmap bmp = new Bitmap(filename))
    {
        // extract and store needed information
    }
}

일단 작업을 수행하면 목적을 위해 충분히 빠른지 결정할 수 있습니다. 그렇지 않은 경우 각 파일에서 첫 번째 킬로바이트 등을 읽음으로써 정보 추출을 시뮬레이션하기 위해 해당 루프를 수정하는 테스트를 제안합니다.

foreach (string filename in ImageFilenames)
{
    using (File f = File.OpenRead(filename))
    {
        // read the first 1K from the file
        // store some placeholder data for height/width
    }
}

그것이 첫 번째보다 훨씬 빠르게 수행된다면, 아마도 자신의 이미지 헤더 구문 분석을 수행 할 가능성을 조사하는 것이 좋습니다. 그러나 당신은 큰 벌레 캔을 열고 있다는 것을 알고 있어야합니다. 이미지 헤더 구문 분석은 상당히 관여 할 수 있습니다.

다른 팁

이미지 파일을 원시 처리 한 지 오래되었지만 가장 일반적인 형식 (GIF, BMP, JPG 등)에서 처음 수백 내에서 높이/폭을 찾을 수 있다고 생각합니다. 파일의 바이트 (또는 그 이하). 헤더 정보를 처리하기 위해 코딩을 수행해야하지만 (아마도 온라인에서 많은 예제 톤) 프로세스 속도를 높여 전체 이미지를 메모리로 읽는 것보다 크게 속도를 높여야합니다.

Windows Explorer와 같은 이미지에서 정보를 추출합니다.

여기를 참조하십시오.

또는 여기 :

또는 다음과 함께 확장 파일 속성을 읽을 수도 있습니다.

public static void Main(string[] args)
{
    List<string> arrHeaders = new List<string>();    
    Shell32.Shell shell = new Shell32.Shell();
    Shell32.Folder objFolder = shell.NameSpace(@"C:\temp\testprop");

    for( int i = 0; i < short.MaxValue; i++) {
        string header = objFolder.GetDetailsOf(null, i);
        if (String.IsNullOrEmpty(header)) break;
        arrHeaders.Add(header);
    }

    foreach(Shell32.FolderItem2 item in objFolder.Items()) {
        for (int i = 0; i < arrHeaders.Count; i++) {
            Console.WriteLine("{0}\t{1}: {2}", i, 
                arrHeaders[i], objFolder.GetDetailsOf(item, i));
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top