2009-08-22 20 views
7

Cố gắng tạo một ứng dụng thu thập hình ảnh được tối ưu hóa cho máy quét nhanh (có thể cung cấp tối đa 6 hình ảnh nén [màu + xám + nhị phân] [trước + sau] cho mỗi giấy ở tốc độ 150 trang/phút) vấn đề. Sử dụng công nghệ TWAIN và chế độ truyền bộ nhớ đệm (TWSX_MEMORY) Tôi nhận được bộ đệm ảnh (dưới dạng tệp JPEG hoặc TIFF được tải trong bộ nhớ) từ máy quét và lưu nó vào đường dẫn đích ứng dụng của tôi. Nếu tôi không muốn tạo hình thu nhỏ, ứng dụng của tôi không làm mất tốc độ cho máy quét, nhưng nếu tôi muốn, theo cách tôi thực hiện (lưu bộ đệm vào một tệp trong C++ TWAIN xử lý dll của tôi, thông báo cho máy chủ .NET của tôi. ứng dụng với đường dẫn tệp đích bằng cách sử dụng một con trỏ hàm, mở tệp hình ảnh trong C# và tạo hình thu nhỏ), ứng dụng của tôi làm giảm tốc độ quét cực nhanh. Tôi đã thử một số tối ưu hóa như thực hiện tải giai đoạn trong một chủ đề riêng biệt và gửi bộ đệm ảnh không được quản lý đến máy chủ .NET và cố gắng tải nó trong một bối cảnh không an toàn (UnmanagedMemoryStream) và tạo hình thu nhỏ. Nhưng nó không cải thiện đáng kể tốc độ. Vì vậy, câu hỏi của tôi là:Có bộ đệm tệp hình ảnh trong bộ nhớ, cách nhanh nhất để tạo hình thu nhỏ của nó là gì?

Có bộ đệm tệp hình ảnh trong bộ nhớ (ví dụ: nén 24 bit JPEG không có hình thu nhỏ được nhúng), có cách trực tiếp nhanh để tạo hình thu nhỏ từ đó không? Bạn đề xuất phương pháp nào nhanh nhất để tạo hình thu nhỏ trong trường hợp này?

Trả lời

7

Nếu đó là hình ảnh JPEG, bạn có thể chỉ cần loại bỏ hầu hết dữ liệu DCT và tạo hình thu nhỏ với công suất hai kích thước, chỉ sử dụng hệ số DCT.

Nếu bạn có thể tìm thấy nguồn cho nó, hãy xem EPEG từ dự án Giác ngộ. Nó thực hiện chính xác những gì bạn đang tìm kiếm với các tệp JPEG, hoàn toàn không cần giải mã hoặc giải nén hình ảnh. Mã nguồn sẽ rất hữu ích.

Đối với các định dạng hình ảnh khác, nó không đơn giản như vậy - bạn sẽ cần phải giải mã và đưa hình ảnh vào bộ nhớ đệm, sau đó thực hiện mở rộng của riêng bạn. CImg và boost :: Các thư viện GIL có thể hỗ trợ điều đó.

+0

Cảm ơn, nó có vẻ là những gì tôi muốn. –

+1

Tôi đã kiểm tra EPEG, cho bất kỳ ai quan tâm đến việc làm tương tự, tôi nên đề cập đến thư viện EPEG hiện tại đã bị loại bỏ khỏi mã nguồn khai sáng, vì vậy bạn nên tìm kiếm nó bên trong mã nguồn cũ của nó. http://download.enlightenment.org/snapshots/2008-01-25/. –

+0

Đối với hình ảnh TIFF, tôi đã sử dụng mã này: http://www.koders.com/c/fidFAE1882A0596B9D224D831B852AE9891D0154D6D.aspx. Nó không nhanh bằng EPEG, nhưng hoàn thành công việc. –

3

Tôi nhận ra rằng vấn đề là phải mất nhiều thời gian để chuyển đổi hình ảnh thành hình thu nhỏ hơn là có được hình ảnh ngay từ đầu, đúng không?

Mặc dù chương trình chuyển đổi hình thu nhỏ nhanh hơn có thể khắc phục được sự cố cho bạn, nhưng có thể không đủ cho một người có máy tính chậm hơn. Thay vào đó, tôi đề xuất tạo hàng đợi hình ảnh được chuyển đổi thành hình thu nhỏ - tức là bạn có một chuỗi (hoặc quy trình) cho biết thêm hình ảnh được quét vào hàng đợi và một luồng/quy trình khác xóa hình ảnh khỏi hàng đợi đó và tạo hình thu nhỏ từ chúng. Bằng cách này, tốc độ tương đối của hai hoạt động không quan trọng.

+0

Cảm ơn câu trả lời, Tôi đã thử phương pháp này, nó cải thiện hiệu suất đáng kể nhưng chưa đủ nhanh. Tôi không chắc chắn rằng tôi đang làm điều đó một cách chính xác, nhưng tôi nên thêm một Application.DoEvents() gọi đến mã C# của tôi để làm cho điều khiển xem hình thu nhỏ của tôi (đầy hình thu nhỏ được tạo ra trong một số chủ đề khác) vô hiệu và toàn bộ quá trình vẫn còn làm cho máy quét chờ một lát (ít hơn một giây) sau khi quét hơn 5 giấy tờ. So sánh với một ứng dụng thương mại đi kèm với thiết bị (mà tôi đang cố gắng sao chép tốc độ của nó và thêm các tính năng tôi cần), nó không đủ nhanh. –

+0

Thật không may tôi không quen thuộc với C# (hoặc TWAIN cho rằng vấn đề) nhưng tôi không thể hiểu làm thế nào xếp hàng kết quả có thể làm chậm máy quét. Tôi giả sử rằng bạn đã đặt mức độ ưu tiên của chuỗi/quy trình chuyển đổi thu nhỏ xuống dưới mức của luồng/quy trình chuyển đổi? Đó là một nguyên nhân có thể xem xét. –

+0

Cảm ơn một lần nữa, Tôi không chắc chắn về nó, có vẻ như với tôi rằng C# chủ đề khác hơn chủ đề chính luôn luôn có một ưu tiên thấp hơn so với chủ đề chính.Tuy nhiên, câu trả lời tiếp theo (greyfade) có vẻ là một giải pháp chức năng hơn cho những gì tôi cần. –

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