Внимание!
Эта публикация перенесена в раздел уроков по адресу Обработка изображений в С++.К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.
Обработка изображений в С++
Предисловие
Сидел я и программировал разнообразную ерунду, а именно графические фильтры и все что с ними связано, на C#. И потихоньку учил С++. Потом решил я сравнить производительность C# и C++.В тесте будут принимать участие самые распространённые графические фильтры : негатив, сепия, корректировка яркости и контрастности. Написал основу на С++ для загрузки/сохранения изображений с использованием DevIL, и перевел коды фильтров с шарпа на C++. Хотя эта основа наверное далека от идеала.
[spoiler]
Вот тест производительности :

Теперь можно посчитать во сколько раз увеличилась производительность :
Пусть

- функция подсчёта во сколько раз различается производительность C# и С++ кода, тогда
f(Negative) = 515 / 16 = 32,1875
f(Sepia) = 562 / 15 = 37,4(6)
f(Brightness) = 749 / 5 = 149,5
f(Contrast) = 780 / 63 = 12,38
Вот это прирост производительности, и даже без особой оптимизации, а вы представьте,если это все дело хорошенько оптимизировать? - получиться очень быстрый код.
Время выполнения кода измеряли функцией

C этого момента я буду писать уроки только на С++, но и поддержу пользователя с ником darkx,который предложил создавать кросс лэнг уроки в комменте. В каждом уроке будут исходники на языках VB.NET, C#.NET, C++, про Delphi ничего сказать не могу,так как очень давно на нём програмировал.
В VB.NET/C#.NET будет использоваться основа с названием Filter, об которой я расказывал в предыдущих уроках :
1)
2)
3)
А в С++ будет использоваться основа, о которой я счас расскажу.
Основа для программирования графических фильтров в С++
При программировании этой основы используется библиотека DevIL, о которой подробно рассказываетcя в статье.
Создайте у себя в проекте файлы :
1) Image.h - header file
2) Image.cpp - cpp code file
В файле Image.h будут храниться описания функций, а в файле Image.cpp - реализации функций. В названиях функций, констант вы встретите приставку "ag", вместо неё вы можете поставить любую другую.Это сделано для того чтобы не было дубликатов функций или констант в разных API.
Файл Image.h
Директива препроцесора #pragma once нужна, для контроля за тем, чтоб конкретный файл подключался при компиляции только один раз.Думаю больше никаких обьяснений к файлу Image.h не надо.Теперь перейдём к реализации.
Откройте файл Image.cpp, и включите в него Image.h :
Теперь разберём каждую функцию;Объяснения к коду будут в комментариях.
1)Функция agLoadImage
2)Функция agSaveImage
3)Функция agNewImage
4) Функция agCloneImage
Вот собственно и все!
</cut>
Сидел я и программировал разнообразную ерунду, а именно графические фильтры и все что с ними связано, на C#. И потихоньку учил С++. Потом решил я сравнить производительность C# и C++.В тесте будут принимать участие самые распространённые графические фильтры : негатив, сепия, корректировка яркости и контрастности. Написал основу на С++ для загрузки/сохранения изображений с использованием DevIL, и перевел коды фильтров с шарпа на C++. Хотя эта основа наверное далека от идеала.
[spoiler]
Вот тест производительности :

Теперь можно посчитать во сколько раз увеличилась производительность :
Пусть

- функция подсчёта во сколько раз различается производительность C# и С++ кода, тогда
f(Negative) = 515 / 16 = 32,1875
f(Sepia) = 562 / 15 = 37,4(6)
f(Brightness) = 749 / 5 = 149,5
f(Contrast) = 780 / 63 = 12,38
Вот это прирост производительности, и даже без особой оптимизации, а вы представьте,если это все дело хорошенько оптимизировать? - получиться очень быстрый код.
Время выполнения кода измеряли функцией

C этого момента я буду писать уроки только на С++, но и поддержу пользователя с ником darkx,который предложил создавать кросс лэнг уроки в комменте. В каждом уроке будут исходники на языках VB.NET, C#.NET, C++, про Delphi ничего сказать не могу,так как очень давно на нём програмировал.
В VB.NET/C#.NET будет использоваться основа с названием Filter, об которой я расказывал в предыдущих уроках :
1)
2)
3)
А в С++ будет использоваться основа, о которой я счас расскажу.
Основа для программирования графических фильтров в С++
При программировании этой основы используется библиотека DevIL, о которой подробно рассказываетcя в статье.
Создайте у себя в проекте файлы :
1) Image.h - header file
2) Image.cpp - cpp code file
В файле Image.h будут храниться описания функций, а в файле Image.cpp - реализации функций. В названиях функций, констант вы встретите приставку "ag", вместо неё вы можете поставить любую другую.Это сделано для того чтобы не было дубликатов функций или констант в разных API.
Файл Image.h
|
Директива препроцесора #pragma once нужна, для контроля за тем, чтоб конкретный файл подключался при компиляции только один раз.Думаю больше никаких обьяснений к файлу Image.h не надо.Теперь перейдём к реализации.
Откройте файл Image.cpp, и включите в него Image.h :
|
Теперь разберём каждую функцию;Объяснения к коду будут в комментариях.
1)Функция agLoadImage
|
2)Функция agSaveImage
|
3)Функция agNewImage
|
4) Функция agCloneImage
|
Вот собственно и все!
</cut>
Внимание!
Эта публикация перенесена в раздел уроков по адресу Обработка изображений в С++.К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.
2908
01.08.2011
25



.
топик на всю страницу, УЖОС ПРОСТО!!!
а топик супер)
топик на всю страницу, УЖОС ПРОСТО!!!
а топик супер)
Я как то подумывал, хм..), хотя честно говоря хочу, написать кросс платформенную прогу которая будет использовать OGL и DevIL для просмотра изображении и некоторых преобразовании(с возможностью сохранения), но все никак руки не дотянуться.
Да еще жесткий посыпался, и вся литература, либы, проекты, заготовки тож «посыпались»((( Ща сижу на Ubuntu с флехи(4 гига) памяти в обрез, работает с подвисонами.(( эх мне б жесткий)))
А ща тут классный код. Буду теперь брать за основу, если руки все же дотянуться писать. Если ты не против.
Просто у меня была проблема, я линь ставил, потом удалил, поставил Виндовс. И один раздел не видело(в Ntfs).Я его удалил, потом форматнул(быстрое форматирование). А потом через какую-то прогу(вроде Partion manager) восстановил все файлы на другой раздел.
Она вроде и раздел с после Linux(ext4) видела и могла восстанавливать.
Может типо такого есть на Linux?.. хотя может уже поздно((
Сочувствую.
Мне хотя и очень обидно за свой жесткий, но он мне верно прослужил около 5-6 лет. Вот — вот собирался новый брать и тут бац, и ппц.
Кстати вроде тут C, а на C++, так не одна из возможностей с++ не использована. А если переделать твою основу в класс, это могло увеличить производительность, так как у тебя инициализация DevIL при каждом вызове функции, а вызовов может быть много.
Это можно сделать один раз в конструкторе класса, и еще не плохо было бы сделать, чтоб класс использовался как контейнер для данных изображения.
new, delete — выделение\удаление памяти в стиле С++.
malloc(), free() — выделение\удаление памяти в стиле C.
а на счёт классов ты предлагаешь сделать как в шарпе Bitmap?.. хотя реализация классов в с++ мне не очень нравится.
Извините.
И, блин, меня учили, что new delete это C, меня ввели в заблуждение(.
Все буду помалкивать.
Я просто высказал, мнение, хоть и неверное.
Просто не прислушивайтесь, скажите че я не прав.
Че так сразу нападать?!