Delphi. GDI+ vs StretchDraw. Как уменьшить много картинок в потоке и сохранить их на диске?

Встала задача – создать thumbnails для полноформатных изображений. В сети уйма информации, не знал за что хвататься, решил пробовать по очереди. В сущности, попробовал 2 способа более менее подробно, а остальные по верхам. Остановился на стандартном StretchDraw из Delphi, из за того, что GDI+ почему-то в дополнительном потоке рисовала белые прямоугольники. Я не стал это глубоко раскапывать, так как нужно было решать задачу.

snimok

В результате получим кучу уменьшенный фотографий практически из любых форматов. Я тестил с Jpg, PNG, Tiff, с другими думаю тоже будет работать, так как для загрузки используется twicimage.

41

Коды приведенные ниже иллюстрируют уменьшение большого числа изображений. Как это работает?

Выбираем директорию

Запускается отдельный поток, в котором в цикле уменьшается большое число изображений

Всё складывается в папочку \thumbnaiPics

Я использовал формат twicimage, который позволяет загружать большое число форматов, ну и в программе уже в ручную ставил фильтр на сами форматы.

Как уменьшить одно изображение с помощью библиотеки GDI+?

В Filename отправляем путь до файла, который надо уменьшить, в Pic получаем уменьшенное изображение, которое можно как-то сохранить, например вот так…

Если вызвать этот код для 1 файла, то всё прекрасно отработает. Но запустить его в потоке, скажем так…

Как уменьшить много картинок в отдельном потоке с GDI+?

Код запуска дополнительного потока из основного

то в моем случае, этот код стал давать белые прямоугольники вместо картинок… Немного поэкспериментировав, я пришел к тому, что стандартная StretchDraw функция из Delphi вполне выполняет мою задачу.

Как уменьшить много картинок в отдельном потоке при помощи StretchDraw?

Код запуска потока (точно такой же)

Метод уменьшения одной картинки при помощи StretchDraw

Модуль потока – полностью (на всякий случай)

Исходники

 

This entry was posted in Delphi, Потоки(Threads). Bookmark the permalink.