Pull to refresh

Comments 15

У меня преобразование картинки в ее собственный альфа-канал (т.е. картинка становится однотонной, а изображение переносится в канал прозрачности) с использованием матрицы заняло в пять раз больше времени, чем с использованием unsafe.
Сепия:
new float[][] {
   new float[] {0.393f, 0.349f, 0.272f, 0, 0},
   new float[] {0.769f, 0.686f, 0.534f, 0, 0},
   new float[] {0.189f, 0.168f, 0.131f, 0, 0},
   new float[] {   0,   0,   0, 1, 0},
   new float[] {   0,   0,   0, 0, 1}
}
g.DrawImage страшно медленная штука (как и весь GDI+) — это вам любой профайлер скажет.

Я когда-то отказался от её использования и перешел на старый и проверенный BitBlt из GDI, получив ускорение в несколько раз. Причем, самой долгой операцией стало получение SafeHandle на HDC. Не знаю почему, кстати.
Задача не позволяла.
Надо было встроить показ карты, реализованной через древнее сишное API, в обычную сишарпную программу.

Всё-таки я бы назвал эту (и предыдущую) статью «Быстрая манипуляция c цветом ...». А то ведь еще есть всякие Graphics.Transform, просто Matrix и пр.
спасибо, интересно.

а кто-нибудь знает как быстро посчитать гистограмму? есть ли способ без полного обхода картинки через GetPixel?
Bitmap.LockBits, если не ошибаюсь, может помочь получить доступ непосредственно к массиву данных. Должен быть быстрее.
Измерять время выполнения кода лучше при помощи класса System.Diagnostics.Stopwatch — он для этого и создан.
А ещё лучше профилировщиком ;-)
Ну вы бы хоть вкратце написали, что это за матрица и на что влияет, почему там надо такие числа задавать и прочее.
Читайте на здоровье, ссылка всего тремя комментариями выше.
Sign up to leave a comment.

Articles