Tôi có một công cụ với các điều khiển trackbar trượt sử dụng để điều chỉnh của hình ảnh độ sáng, độ tương phản, gamma vvnhanh hơn thuật toán độ tương phản cho một bitmap
tôi đang cố gắng để có được cập nhật theo thời gian thực cho hình ảnh của tôi trong khi người dùng kéo thanh trượt. Thuật toán độ sáng và gamma là tốc độ chấp nhận được (khoảng 170ms). Nhưng thuật toán tương phản là khoảng 380ms.
Về cơ bản, biểu mẫu của tôi là cửa sổ công cụ có thanh trượt. Mỗi lần hình ảnh được cập nhật, nó sẽ gửi một sự kiện đến cha mẹ sẽ vẽ lại hình ảnh mới. Cửa sổ công cụ giữ hình ảnh chưa sửa đổi ban đầu bị khóa trong bộ nhớ vì vậy tôi luôn có quyền truy cập vào các byte của nó. Vì vậy, về cơ bản tôi làm điều này mỗi khi sự kiện ValueChanged cho một thanh trượt (chẳng hạn như thanh trượt Contrast) được thay đổi.
- LockBits của bitmap làm việc (đích) như Format24bppRgb (bitmap gốc là trong Format32bppPArgb)
- Marshal.Copy các bit vào một mảng byte []
- Kiểm tra hoạt động mà tôi đang làm (trong đó thanh trượt được chọn)
- Sử dụng đoạn mã sau cho Contrast:
code:
double newValue = 0;
double c = (100.0 + contrast)/100.0;
c *= c;
for (int i = 0; i < sourcePixels.Length; i++)
{
newValue = sourcePixels[i];
newValue /= 255.0;
newValue -= 0.5;
newValue *= c;
newValue += 0.5;
newValue *= 255;
if (newValue < 0)
newValue = 0;
if (newValue > 255)
newValue = 255;
destPixels[i] = (byte)newValue;
}
Tôi đọc một lần về cách sử dụng số nguyên thay vì giá trị dấu phẩy động để tăng tốc độ tương phản, nhưng tôi không thể tìm thấy bài viết đó một lần nữa.
Tôi đã thử sử dụng mã không an toàn (con trỏ) nhưng thực sự nhận thấy tốc độ giảm. Tôi cho rằng đó là vì mã được sử dụng lồng nhau cho các vòng lặp để lặp x và y thay vì một vòng lặp đơn.
bản sao có thể có của [Điều chỉnh độ tương phản của hình ảnh trong C# một cách hiệu quả] (http://stackoverflow.com/questions/3115076/adjust-the-contrast-of-an-image-in-c-sharp-efficiently) – Magnus
Mã không an toàn trong câu hỏi mà bạn đã liên kết, khi tôi thử nghiệm nó với cùng một hình ảnh như tôi đang sử dụng với mã của tôi, mất hơn 900 mili giây cho mỗi thường trình. Tất nhiên tôi đã sửa đổi nó để nó không sao chép hoặc tạo bitmap mới, nó chỉ là vòng lặp lồng nhau với con trỏ và toán học dấu phẩy động. Nó quá chậm. –
Có lẽ bạn có thể sửa đổi mã của mình để sử dụng con trỏ thay vì mã không an toàn. – Magnus