2009-12-30 4 views
2

편집 :파일이 전체 파일을로드하지 않고 이미지인지 아닌지 확인하는 방법은 무엇입니까? 이미지 헤더 읽기 라이브러리가 있습니까?

죄송합니다. 제 질문은 모호합니다. 파일이 이 아닌지 확인하는 방법이 필요합니다. 이미지를로드하는 데 시간을 낭비하지 않고 이미지를로드해야합니다. 그 이유는 나중에 나머지로드 작업을 수행 할 수 있기 때문입니다. 파일 확장명을 확인하고 싶지 않습니다.

응용 프로그램은 이미지를 봅니다. '유효성 검사'를 통해 '비 이미지 파일 탐지 및 건너 뛰기'를 해당 디렉토리에서도 의미합니다. 픽셀 데이터가 손상된 경우이를 이미지로 취급하고 싶습니다.

페이지 번호를 지정하고 이미지를 쌍으로 만듭니다. 일부 이미지는 왼쪽 또는 오른쪽 단일 페이지입니다. 일부 이미지는 넓으며 왼쪽 및 오른쪽 페이지의 "확산"입니다. 예를 들어, pagesAt (3) 및 pagesAt (4)는 동일한 std :: 이미지 쌍 또는 동일한 와이드 이미지의 std :: pair를 반환 할 수 있습니다.

때로는 홀수 개의 '얇은'이미지가 있고 첫 번째 이미지는 넓은 이미지와 비슷하게 자체적으로 표시됩니다. 단일 커버 페이지 일 수 있습니다.

디렉토리의 어떤 파일이 비 이미지인지 알지 못한다는 것은 자신의 페이지 번호를 할당하고 파일을 표시 할 수없는 것을 의미합니다. 또한 사용자는 페이지 X로 건너 뛰기로 결정할 수 있으며 비 이미지 파일을 나중에 발견하여 제거하고 페이지 번호를 다시 할당하면 페이지 X가 다른 이미지로 보일 수 있습니다. 원래

: 그것은 중요한 경우

, 내가 Qt는 라이브러리에서 C++ 및 QImage를 사용하고 있습니다.

저는 디렉토리를 반복하고 이미지 경로에 QImage 생성자를 사용하고 있습니다. 이것은 물론 느리고 응용 프로그램이 응답하지 않게 만듭니다. 그러나, 그것은 내가 잘못된 이미지 파일을 감지하고 조기에 그들을 무시할 수있게 해줍니다.

디렉토리를 통과하는 동안 이미지 경로 만 저장할 수 있으며 실제로 필요할 때만로드 할 수 있습니다.하지만 이미지가 유효하지 않은지 여부는 알 수 없습니다.

나는이 두 가지 조합을 고려하고 있습니다. 즉, 디렉토리를 반복하는 동안 유효성을 검사하기 위해 이미지의 헤더 만 읽은 다음 필요한 경우 이미지 데이터를로드합니다.

그래서,

는 이미지 헤더 전체 이미지를로드하는 것보다 훨씬 더 빨리로드 것인가? 또는 헤더를 읽으려면 약간의 입출력을하고 있습니다. 이미지를 전체적으로로드하는 작업을 마칠 수도 있습니다. 나중에 아카이브의 이미지 압축을 풀 것입니다. 따라서 헤더 전체를 압축 해제하고 전체 파일을 압축 해제하는 경우에도 적용됩니다.

또한,로드하는 방법/그냥 이미지 헤더를 읽는 방법을 모르겠다. 이미지의 헤더 만 읽을 수있는 라이브러리가 있습니까? 그렇지 않으면 각 파일을 스트림으로 열고 모든 파일 유형에 대한 이미지 헤더 판독기를 독자적으로 코딩해야합니다.

+0

이미지가 유효한지 얼마나 빨리 알 필요가 있습니까? (바로 전화를 걸거나, 정의되지 않은 시간이 지나면 즉시?) 이미지를 조작하고, 보여 주며, 다른 곳으로 데이터를 옮기는 이미지로 무엇을하고 있습니까? –

+0

위의 질문을 명확히했습니다. 타당성에 의해, 단순히 파일 확장자를 보거나 전체 이미지 파일을로드하지 않고 비 이미지 파일을 검색하는 것을 의미했습니다. 그래서 디렉토리를 반복 할 때만 헤더를 검사 할 수있는 방법이 있는지 물어 보았습니다. – Kache

답변

4

유닉스 file 도구 (거의 영원부터 있었음)는 정확히 이것을 수행합니다. 알려진 파일 헤더와 바이너리 서명의 데이터베이스를 사용하여 파일 유형을 식별하고 잠재적으로 간단한 정보를 추출하는 간단한 도구입니다.

데이터베이스는 간단한 구조화 된 형식 (man magic에 설명 됨)을 사용하여 과다한 바이너리 파일 형식을 설명하는 간단한 텍스트 파일 (효율성을 높이기 위해 컴파일 됨)입니다. 출처는 /usr/share/file/magic (우분투)입니다. 예를 들어, PNG 파일 형식에 대한 항목은 다음과 같습니다

0  string   \x89PNG\x0d\x0a\x1a\x0a   PNG image 
!:mime image/png 
>16  belong   x    \b, %ld x 
>20  belong   x    %ld, 
>24  byte   x    %d-bit 
>25  byte   0    grayscale, 
>25  byte   2    \b/color RGB, 
>25  byte   3    colormap, 
>25  byte   4    gray+alpha, 
>25  byte   6    \b/color RGBA, 
>28  byte   0    non-interlaced 
>28  byte   1    interlaced 

당신은 file 도구에서 파서를 사용하는 경우에도 단지 이미지 파일 형식의 서명을 추출하고, 자신의 "스니퍼"를 구축, 또는 수 (BSD 라이센스가있는 것 같습니다).

+0

달콤한, 고마워. 하지만이 응용 프로그램이 교차 플랫폼에서 작동하도록하고 싶습니다. 그래서 유닉스 시스템 호출에 의존 할 수 없습니다. '내 스니퍼'를 구축하면 내 '헤더 리더'를 코딩한다는 의미입니까? 아니면 제가 파일 도구의 소스를 얻을 수있는 방법이 있다는 말입니까? – Kache

+0

신경 쓰지 마, 나는 그것을위한 근원을 발견했다. 이제는 직접 사용하거나 직접 코드를 작성해야하는지 확인해야합니다. – Kache

0

헤더를로드하는 것에 대한 답을 모르며로드하려고하는 이미지 유형에 따라 달라질 수 있습니다. 가능한 경우 Qt :: Concurrent를 사용하여 나머지 프로그램을 계속 허용하면서 이미지를 검토하는 것이 좋습니다.이 경우 처음에는 모든 항목을 알 수없는 상태로 표시 한 다음 확인이 완료되면 이미지가 아닌 이미지로 변경됩니다.

+0

모든 이미지가 동일한 형식이 될 수 있습니다. 한두 개의 다른 이미지가있을 수 있습니다. 같은 포맷의 2/3 이미지를 찾으면 나머지는 모두 똑같은 것으로 가정 할만큼 충분히 확신 할 수 있습니다. – Kache

0

일반적인 형식의 이미지 파일뿐만 아니라 특정 형식이 아니라면 이미지 헤더가 유효하지만 이미지 데이터가 유효하지 않은 경우가있을 수 있습니다. 응용 프로그램에 대해 아무 말도하지 않은 채, 백그라운드에서 스레드에 몇 가지 이미지를 보관할 수있는 추가 방법이 없으며 사용자가 다음에로드 할 수있는 내용에 따라 RAM을 바꿔 넣을 수 있습니다. IE : 슬라이드 쇼 앱은 현재 또는 뒤로 이미지를 1 ~ 2 개로드합니다. 또는 백그라운드 스레드가 데이터의 유효성을 확인할 때까지 이미지 이름 옆에 물음표가 표시 될 수 있습니다.

+0

데이터가 손상되었습니다. 나는 전에 너무 분명하지 않았습니다, 미안 해요. 필자가 정말로 필요로하는 것은 파일 확장자를 보거나 전체 이미지를로드하는 데 시간을 낭비하는 것보다 더 지능적인 방식으로 비 이미지를 감지하는 것입니다. – Kache

0

로컬 파일 시스템의 파일 헤더를 열고 읽는 것이 너무 비싸지 않아도되지만 파일이 원격 (네트워크로 연결된) 파일 시스템에 있으면 비용이 많이들 수 있습니다. 심지어 악화 될 경우 hierarchical storage management으로 저장된 파일에 액세스하는 경우 파일을 읽는 것이 매우 비쌀 수 있습니다.

이 응용 프로그램이 당신에게 적합한 경우, 당신은 그 문제에 대해 걱정하지 않기로 결정할 수 있습니다. 그러나 대중에게 앱을 배포하는 경우 절대적으로 필요하기 전에 파일을 읽으면 일부 사용자에게 문제가 발생할 수 있습니다.

Raymond Chen은 그의 블로그 The Old New Thing에 대한 기사를 작성했습니다.

+0

나는 그것이 문제가 될 것이라고 생각하지 않는다. 최종 사용자가 이미지를 통해 책의 페이지처럼 읽는 GUI 응용 프로그램이므로 모두 로컬이됩니다. 최악의 경우에는 외장형 하드 드라이브 나 근처의 LAN 밖에없는 것 같습니다. – Kache

3

QImageReader를 사용하여 이미지 파일 에 대한 정보를 얻으려면 실제로 파일을로드하지 않아도됩니다.

예를 들어 .format 메소드를 사용하면 파일의 이미지 형식을 확인할 수 있습니다. 공식 Qt는 문서 (http://qt-project.org/doc/qt-4.8/qimagereader.html#format)에서

:

는 QImageReader 이미지를 읽기 위해 사용하는 포맷을 돌려줍니다. 기기에 기기를 할당 한 후 으로 전화를 걸어 기기의 형식을 확인할 수 있습니다. 예 : QImageReader reader ("image.png"); // reader.format() == "png"판독기가 장치의 이미지를 읽을 수 없거나 (예 : 거기에 이미지가 없거나 이미지에 이미 이 읽혀있는 경우) 또는 지원되지 않는 형식 인 경우, 이 함수는 빈 QByteArray()를 반환합니다.

+0

팁, 찾기 어려운 문서, +1 – neuviemeporte

관련 문제