2009-05-07 28 views
5

Tôi cần hiển thị hình thu nhỏ của hình ảnh trong một thư mục nhất định. Tôi sử dụng TFileStream để đọc tập tin hình ảnh trước khi tải hình ảnh vào một thành phần hình ảnh. Sau đó bitmap được thay đổi kích thước thành kích thước hình thu nhỏ và được gán cho thành phần TImage trên TScrollBox.Cách tải nhanh nhất và định cỡ lại hình ảnh là gì?

Dường như hoạt động tốt, nhưng chậm lại khá nhiều với hình ảnh lớn hơn.

Có cách tải tệp (hình ảnh) nhanh hơn từ đĩa và thay đổi kích thước chúng không?

Xin cảm ơn, Pieter

Trả lời

5

Không thực sự. Những gì bạn có thể làm là thay đổi kích thước chúng trong một chủ đề nền và sử dụng một hình ảnh "giữ chỗ" cho đến khi thay đổi kích thước được thực hiện. Sau đó tôi sẽ lưu các hình ảnh đã thay đổi kích thước này vào một số loại tệp bộ nhớ cache để xử lý sau này (các cửa sổ thực hiện điều này và gọi bộ nhớ cache thumbs.db trong thư mục hiện tại).

Bạn có một số tùy chọn trên chính cấu trúc chuỗi. Một luồng duy nhất thực hiện tất cả các hình ảnh hoặc một nhóm luồng nơi một luồng chỉ biết cách xử lý một hình ảnh đơn lẻ. Thư viện AsyncCalls thậm chí còn là một cách khác và có thể giữ mọi thứ khá đơn giản.

+0

Ứng dụng của tôi hiện sử dụng trình giữ chỗ và chuỗi chủ đề (skamradt, mghie) và nó hoạt động hoàn hảo.Các hình thu nhỏ được trích xuất theo đề xuất của Stijn Sanders. Cảm ơn bạn. Pieter. –

+0

Thật không may, AsyncCalls đã chết (ngừng). – Ampere

5

Tôi sẽ bổ sung câu trả lời của skamradt với nỗ lực thiết kế mục này để nhanh nhất có thể. Đối với điều này, bạn nên

  • tối ưu hóa I/O
  • sử dụng nhiều luồng để tận dụng đa lõi CPU, và để giữ thậm chí một lõi CPU đơn làm việc trong khi bạn đọc (hoặc viết) tập tin

Việc sử dụng nhiều chủ đề ngụ ý rằng việc sử dụng các lớp VCL để thay đổi kích thước sẽ không hoạt động, vì VCL không phải là luồng an toàn và tất cả các hack xung quanh không mở rộng tốt. efg's Computer Lab có các liên kết cho mã xử lý hình ảnh.

Điều quan trọng là không gây ra một số hoạt động I/O đồng thời khi sử dụng nhiều luồng. Nếu bạn chọn ghi hình ảnh thu nhỏ trở lại tệp, khi bạn đã bắt đầu đọc một tệp, bạn nên đọc nó hoàn toàn và sau khi bạn đã bắt đầu viết một tệp, bạn cũng nên viết nó hoàn toàn. Việc xen kẽ cả hai hoạt động sẽ giết chết I/O của bạn, bởi vì bạn có khả năng gây ra rất nhiều hoạt động tìm kiếm đầu đĩa cứng.

Để có kết quả tốt nhất, việc đọc (và viết) các tệp cũng không được xảy ra trong luồng chính (GUI) của ứng dụng của bạn. Điều đó sẽ đề xuất thiết kế sau:

  • Có một chủ đề đọc tệp thành các đối tượng TGraphic và đưa chúng vào danh sách an toàn.
  • Có một nhóm chủ đề chờ trong danh sách các tệp ở kích thước gốc và có một luồng xử lý một đối tượng TGraphic, thay đổi kích thước nó thành đối tượng TGraphic khác và thêm vào danh sách chuỗi an toàn khác.
  • Thông báo cho chủ đề GUI cho từng hình ảnh thu nhỏ được thêm vào danh sách, vì vậy nó có thể được hiển thị.
  • Nếu hình thu nhỏ được ghi vào tệp, hãy thực hiện điều này trong chuỗi đọc (xem phần giải thích ở trên).

Edit:

On đọc lại câu hỏi của bạn tôi nhận thấy rằng bạn có thể chỉ cần thay đổi kích thước một hình ảnh, trong trường hợp một sợi nền duy nhất là tất nhiên đủ. Tôi sẽ để lại câu trả lời của tôi tại chỗ anyway, có thể nó sẽ được sử dụng cho người khác một thời gian. Đó là những gì tôi đã học được từ một trong những dự án mới nhất của tôi, nơi mà chương trình cuối cùng có thể cần tốc độ nhanh hơn một chút nhưng chỉ sử dụng khoảng 75% của máy lõi tứ vào thời điểm cao điểm. Việc tách I/O khỏi quá trình xử lý sẽ tạo ra sự khác biệt.

5

Tôi thường sử dụng TJPEGImage với Thang đo: = jsEighth (trong Delphi 7). Điều này thực sự nhanh vì việc nén JPEG có thể bỏ qua rất nhiều dữ liệu để lấp đầy một bitmap chỉ có chiều rộng và chiều cao thứ tám.

Một lựa chọn khác là sử dụng shell's method to extract a thumbnail, mà là khá nhanh càng tốt

+0

điều này có vẻ tốt. Tôi đã tuyệt vọng để tìm ra điều này trong năm ngoái nhưng bây giờ tôi không còn quan tâm quá nhiều. Nhưng tôi vẫn có thể sửa một số ứng dụng của mình bằng cách sử dụng phương pháp TJPEGImage.Scale. Cảm ơn –

1

tôi trong kinh doanh tầm nhìn, và tôi chỉ đơn giản là tải lên các hình ảnh vào GPU sử dụng OpenGL. (thường là 20x 2048x2000x8bpp mỗi giây), một bmp trên mỗi kết cấu, và để cho quy mô videocard (win32, tiêu đề mở đầu của Mike Lischke)

Tải lên một hình ảnh có giá 5-10ms tùy vào videocard chính xác (nếu không được tích hợp và nvidia 7300 series hoặc mới hơn. Các GPU tích hợp rất gần đây cũng có thể thực hiện được). Mở rộng và hiển thị chi phí 300us. Điều này có nghĩa là khách hàng có thể xoay và thu phóng như điên mà không cần chạm vào ứng dụng. Tôi vẽ một lớp phủ (được sử dụng để là một tmetafile nhưng bây giờ là một định dạng riêng) trên đầu trang của nó.

Ảnh lớn nhất của tôi là 4096x7000x8bpp hiển thị và chia tỷ lệ dưới 30 mili giây. (GF 8600)

Hạn chế của công nghệ này là kích thước họa tiết tối đa. Nó có thể được giải quyết bằng cách phân mảnh hình ảnh thành nhiều họa tiết, nhưng tôi vẫn chưa băn khoăn vì tôi cung cấp các hệ thống với phần mềm.

(một số kích thước tiêu biểu: nv6x00 series: 2k * 2k nhưng tải lên được chỉ là về phá vỡ thậm chí so với GDI nv7x00 series:. 4k * 4k Đối với tôi các thẻ cơ bản GF7300 của giống như $ 20-40 nv8x00 series: 8k * 8k )

Lưu ý rằng điều này có thể không dành cho tất cả mọi người. Nhưng nếu bạn đang ở trong tình huống may mắn để xác định giới hạn phần cứng, nó có thể hoạt động. Vấn đề chính là máy tính xách tay như Thinkpads, các GPU trong số đó là máy tính xách tay cũ hơn máy tính xách tay avg, thường là một thế hệ đằng sau Máy tính để bàn.

Tôi đã chọn OpenGL trên DirectX vì nó là tĩnh hơn trong thời gian và dễ dàng hơn để tìm các ví dụ không liên quan đến trò chơi.

+0

rất nhiều thông tin nhưng ngoài chủ đề. –

+0

tôi thấy đây là những gì tôi đang tìm kiếm. cảm ơn bạn! –

0

Khai thác dung lượng cửa sổ để tạo hình thu nhỏ. Hãy nhớ rằng các tệp Thumbs.db ẩn trong các thư mục chứa hình ảnh?

Tôi đã triển khai một cái gì đó giống như tính năng này nhưng trong VB. Phần mềm của tôi có thể tạo hình thu nhỏ 100 tệp (kích thước hỗn hợp) trong khoảng 10 giây.

Tôi không thể chuyển đổi sang Delphi.

0

Hãy thử xem xét Graphics32 library: nó rất tốt khi vẽ mọi thứ và hoạt động tuyệt vời với Bitmap. Họ là chủ đề - an toàn với ví dụ tốt, và nó hoàn toàn miễn phí.

Các vấn đề liên quan