Разработка загрузчика изображений

Имеется некий небольшой хостинг изображений, дизайн скромен и функционален, все, что надо, но какой же серьезный хостинг без толкового десктопного загрузчика? Правильно. Никакой. Непорядок. Надо разработать. Для начала установим функции, которые он должен выполнять, но надо учитывать, что загрузчик — не программа все в одном, а просто загрузчик с минимумом функций, но максимально полезный. Приступим.

Поставленные задачи

  1. Загрузка изображений
  2. Доступность загружаемого изображения во время использования его программой
  3. Визуализация процесса загрузки
  4. Интеграция в контекстное меню
  5. Ресайз изображения с сохранением пропорций
А теперь по порядку.

Загрузка изображений

Здесь задача довольно тривиальна, запускаем любой HTTP сниффер, загружаем картинку через браузер, отлавливая все то, что отправляется серверу, формируем POST запрос на основе этих данных, конвертируем картинку в массив байт и отправляем на сервер вместе со всей информацией (имя файла, срок хранения, приватность, etc). Получаем ссылку на страницу с загруженным изображением, парсим оттуда нужные ссылки, выводим пользователю в нашем приложении. Готово. Основную задачу мы реализовали. Идем дальше.

Доступность загружаемого изображения во время использования его программой

Здесь все просто, делаем так, как это делают некоторые серьезные программы и не изобретаем велосипед, перед загрузкой делаем рабочую копию изображения, которая и будет использоваться программой, а после окончания работы с этой копией, удаляться. Оригинал остается свободным и пользователь может делать с ним что угодно, удалять во время загрузки, переименовывать, перемещать и так далее, все, что придет в голову нашему уважаемому пользователю.

Визуализация процесса загрузки

Так как загрузка в моем случае выполнялась одной стандартной функцией — отследить процесс загрузки цельного массива было невозможно, можно было видеть только момент начала загрузки и момент окончания загрузки. Получается, цельный массив — не наш вариант, отлично, делим его на n частей, не очень много, не стоит посылать по одному байту, но и не сильно мало, чтобы визуально процесс загрузки шел плавно. Я поделил массив на 1000 частей, этого вполне достаточно, на производительности это никак не сказывается. Задача решена, приступим к следующей.

Интеграция программы в контекстное меню

Контекстное меню хранится у нас в реестре, отлично, добавляем, программно, конечно, в реестр нужные ключи и вуаля. Ключи у меня получились следующие:
HKEY_CLASSES_ROOT\\*\\shell\\%programname%
HKEY_CLASSES_ROOT\\*\\shell\\%programname%\command

Устанавливаем значения, для первого ключа — имя, то, что и будет отображаться в контекстном меню, для второго — то, что будет выполняться при выборе данного пункта меню, а именно — запуск приложения с передачей ему параметра — имени файла, на котором, собственно, и был активирован этот пункт меню. Выглядит это так:
Application.ExecutablePath + " %1";

Где Application.ExecutablePath — как уже стало понятно, путь до запускающего программу файла.
%1 — реестровая переменная, хранящая полное имя файла, который мы и будет загружать.

Очевидно, что после данной манипуляции пользователь увидит второю копию программы — это неудобно, а значит, недопустимо.
Из этой ситуации я вышел следующим образом:
Первая копия программы выполняет функцию сервера, которая ожидает отправки от клиента сообщение, содержащее переданный ему параметр — имя файла, если второй копии программы удается передать параметр, программа выполняет это и закрывается, толком и не запустившись, пользователь ничего из этого не замечает. Сервер же, в случае получения сообщения от клиента, начинает загрузку указанного файла. Задача выполнена.

Ресайз изображения с сохранением пропорций

Пишем\ищем\пользуемся стандартной, если таковая есть, функцией по изменению размера изображения. Пользователю даем на изменение два поля, ширину и высоту изображения, изначально устанавливаем оригинальные размеры картинки. При изменении значения одного из полей высчитываем значение второго и устанавливаем во второе поле. Расчеты очень простые: вычисляем отношение высоты к ширине, теперь:
  1. Высота = ширина * отношение
  2. Ширина = высота / отношение
Сохраняем рабочую копию с указанными размерами и, естественно, загружаем её.
Итог: уменьшенный размер картинки для более быстрого просмотра другими пользователями, экономия трафика для тех, до кого еще не дошли прелести цивилизации в виде безлимитного и\или скоростного интернета.

Теперь, после выполнения всех выше перечисленных пунктов загрузчик готов. Этих функций, по-моему мнению, вполне достаточно, они укладываются в небольшой размер приложения и довольно часто будут использоваться постоянными посетителями хостинга изображений.


1 комментарий

комментарий был удален
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.