문제

주어진 디렉토리에 이미지의 축소판을 표시해야합니다. 이미지 구성 요소에 이미지를로드하기 전에 TFILESTREAM을 사용하여 이미지 파일을 읽습니다. 그런 다음 비트 맵을 썸네일 크기로 크기로 크기로 조정하고 tscrollbox의 타이밍 구성 요소에 할당됩니다.

잘 작동하는 것처럼 보이지만 더 큰 이미지로 꽤 많이 느려집니다.

디스크에서 파일 (이미지) 파일을 더 빠르게로드하고 크기를 조정하는 방법이 있습니까?

고마워요, 피터

도움이 되었습니까?

해결책

설마. 당신이 할 수있는 일은 배경 스레드에서 크기를 조정하고 크기 조정이 완료 될 때까지 "장소 홀더"이미지를 사용하는 것입니다. 그런 다음이 크기의 이미지를 나중에 처리하기 위해 일종의 캐시 파일에 저장합니다 (Windows는이 작업을 수행하고 현재 디렉토리에서 Cache Thumbs.db를 호출합니다).

스레드 아키텍처 자체에 몇 가지 옵션이 있습니다. 모든 이미지를 수행하는 단일 스레드 또는 스레드가 단일 이미지를 처리하는 방법 만 알고있는 스레드 풀. 그만큼 AsyncCalls 도서관은 또 다른 방법이며 물건을 상당히 단순하게 유지할 수 있습니다.

다른 팁

Skamradt의 답변을 가능한 빨리 설계하려는 시도로 답을 보완하겠습니다. 이것을 위해 당신은해야합니다

  • I/O 최적화
  • 여러 스레드를 사용하여 여러 CPU 코어를 사용하고 파일을 읽거나 쓰는 동안 단일 CPU 코어를 유지하십시오.

여러 스레드를 사용한다는 것은 VCL이 스레드 안전하지 않기 때문에 크기 조정에 VCL 클래스를 사용하는 것이 작동하지 않을 것이며, 그 주변의 모든 해킹은 확장되지 않습니다. EFG의 컴퓨터 실 이미지 처리 코드 링크가 있습니다.

여러 스레드를 사용할 때 여러 동시 I/O 작업을 유발하지 않는 것이 중요합니다. 썸네일 이미지를 파일에 다시 작성하기로 선택한 경우 파일을 읽기 시작한 후에는 완전히 읽어야하며 파일을 작성하기 시작하면 파일도 작성해야합니다. 두 가지 작업을 모두 인터리브하면 I/O가 사망 할 수 있습니다. 잠재적으로 하드 디스크 헤드의 많은 작업을 유발할 수 있기 때문입니다.

최상의 결과를 얻으려면 파일의 읽기 (및 쓰기)도 응용 프로그램의 기본 (GUI) 스레드에서 발생하지 않아야합니다. 그것은 다음 디자인을 제안합니다.

  • 하나의 스레드가 파일을 tgraphic 객체에 읽고 스레드 안전 목록에 넣습니다.
  • 스레드 풀이 원래 크기의 파일 목록을 대기하고 하나의 스레드 프로세스 하나의 tgraphic 객체를 사용하여 다른 tgraphic 객체로 크기를 조정 한 다음 다른 스레드 안전 목록에 추가하십시오.
  • 목록에 추가 된 각 썸네일 이미지에 대해 GUI 스레드에 알리므로 표시 할 수 있습니다.
  • 썸네일을 파일로 작성하려면 읽기 스레드에서도이를 수행하십시오 (설명은 위 참조).

편집하다:

질문을 다시 읽을 때는 하나의 이미지를 크기를 조정하면됩니다.이 경우 단일 배경 스레드만으로도 충분합니다. 어쨌든 내 대답을 제자리에 남겨 두겠습니다. 어쩌면 다른 사람에게 사용될 것입니다. 최신 프로젝트 중 하나에서 배운 것입니다. 최종 프로그램은 약간 더 빠른 속도가 필요했지만 피크 타임에 쿼드 코어 머신의 약 75% 만 사용하고있었습니다. 처리에서 I/O를 분리하면 차이가 생겼을 것입니다.

나는 종종 scale : = jseight (델파이 7)와 함께 tjpegimage를 사용합니다. JPEG DE-Compression이 많은 데이터를 건너 뛰면 너비와 높이의 8 분의 1 비트 맵을 채울 수 있기 때문에 이것은 정말 빠릅니다.

또 다른 옵션은 썸네일을 추출하는 쉘의 방법, 그것은 매우 빠릅니다

저는 비전 사업을하고 있으며 OpenGL을 사용하여 이미지를 GPU에 업로드합니다. (일반적으로 초당 20x 2048x2000x8bpp), 텍스처 당 BMP, Videocard Scale (Win32, Mike Lischke의 OpenGL 헤더)

이러한 이미지의 업로드는 정확한 비디오 카드에 따라 5-10ms입니다 (통합되지 않은 경우 및 NVIDIA 7300 시리즈 또는 최신 정보. 최근 통합 GPU도 수행 할 수 있습니다). 스케일링 및 표시 비용 300us. 이는 고객이 앱을 만지지 않고 미친 듯이 팬과 확대 할 수 있음을 의미합니다. 나는 그 위에 오버레이 (tmetafile 이었지만 이제는 자체 형식)를 그립니다.

내 가장 큰 사진은 4096x7000x8bpp로 30ms 미만의 스케일을 보여줍니다. (GF 8600)

이 기술의 한계는 최대 텍스처 크기입니다. 그림을 여러 텍스처로 조각화하여 해결할 수 있지만 소프트웨어로 시스템을 전달하기 때문에 아직 귀찮게하지 않았습니다.

(일부 일반적인 크기 : NV6X00 시리즈 : 2K*2K이지만 업로드는 GDI NV7X00 시리즈에 비해 거의 중단됩니다.

이것이 모든 사람을위한 것은 아닙니다. 그러나 행운의 상황에 있으면 하드웨어 한도를 지정하는 경우 효과가있을 수 있습니다. 주요 문제는 ThinkPad와 같은 랩톱이며, GPU는 AVG 노트북보다 오래되었으며, 종종 데스크탑 뒤의 세대입니다.

DirectX보다 OpenGL을 선택했습니다. 시간이 지남에 따라 정적이며 게임이 아닌 관련 예제를 찾기가 더 쉽기 때문입니다.

보려고 노력하십시오 그래픽 32 라이브러리 : 그것은 물건과 작품을 그리는 데 매우 능숙합니다. 엄청난 비트 맵으로. 그것들은 실입니다 - 좋은 예를 가지고 안전하며 완전히 무료입니다.

Windows 용량을 악용하여 미리네일을 생성합니다. 이미지가 포함 된 폴더의 숨겨진 썸장 .db 파일을 기억하십니까?

이 기능과 같은 것을 구현했지만 VB에서는 구현했습니다. 내 소프트웨어는 약 10 초 안에 100 파일 (혼합 크기)의 썸네일을 구축 할 수 있습니다.

그래도 델파이로 변환 할 수는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top