Каков самый быстрый способ загрузить и изменить размер изображения?

Модуль запросов может соответствовать тому, что вы хотите сделать, используя кортеж или словарь. В качестве примера ниже я передал словарь settings_json в родительский словарь data.

Вы можете попробовать что-то вроде следующего:

import requests

url = 'https://example.com/v1/doThing'

settings_json = {
    'name': 'bob',
    'age': 57
}

data = {
    'mode': 'merge',
    'json_data': settings_json
}

r=requests.post(url, auth=(myToken,'password'), data=data)

Если это не работает для вашего случая использования, вы всегда можете обратиться к документам запросов для дополнительных примеров. [118 ]

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

Этот также является полезным инструментом для преобразования curl запросов в другие языки.

5
задан Pieter van Wyk 7 May 2009 в 16:19
поделиться

6 ответов

Не совсем. Что вы можете сделать, так это изменить их размер в фоновом потоке и использовать изображение «заполнитель», пока изменение размера не будет выполнено. Затем я бы сохранил эти изображения с измененным размером в какой-то файл кеша для последующей обработки (Windows делает это и вызывает кеш thumbs.db в текущем каталоге).

У вас есть несколько вариантов в самой архитектуре потока. Один поток, который выполняет все изображения, или пул потоков, в котором поток знает, как обрабатывать только одно изображение. Библиотека AsyncCalls - это еще один способ сделать вещи довольно простыми.

5
ответ дан 18 December 2019 в 12:01
поделиться

Используйте возможности Windows для создания миниатюр. Помните, что скрытые файлы Thumbs.db в папках, которые содержат изображения?

Я реализовал нечто подобное этой функции, но в VB. Мое программное обеспечение способно создавать эскизы из 100 файлов (смешанного размера) примерно за 10 секунд.

Однако я не могу преобразовать его в Delphi.

0
ответ дан 18 December 2019 в 12:01
поделиться

I often use TJPEGImage with Scale:=jsEighth (in Delphi 7). This is really fast because the JPEG de-compression can skip a lot of the data to fill a bitmap of only an eighth of width and height.

Another option is to use the shell's method to extract a thumbnail, which is pretty fast as well

4
ответ дан 18 December 2019 в 12:01
поделиться

Я дополню ответ skamradt попыткой сделать его максимально быстрым. Для этого вы должны

  • оптимизировать ввод / вывод
  • использовать несколько потоков, чтобы задействовать несколько ядер ЦП, и чтобы даже одно ядро ​​ЦП работало, пока вы читаете (или пишете) файлы.

Использование нескольких потоков подразумевает, что использование классов VCL для изменения размера не сработает, поскольку VCL не является потокобезопасным, и все хаки вокруг, которые плохо масштабируются. Компьютерная лаборатория efg содержит ссылки для кода обработки изображений.

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

Для достижения наилучших результатов чтение (и запись) файлов также не должно происходить в основном (GUI) потоке. вашего приложения. Это предполагает следующую схему:

  • Пусть один поток читает файлы в объекты TGraphic и помещает их в поточно-безопасный список.
  • Пусть пул потоков ожидает список файлов исходного размера и имеет один поток обработать один объект TGraphic, изменить его размер на другой объект TGraphic и добавить его в другой список потоковой безопасности.
  • Уведомлять поток графического интерфейса пользователя для каждого миниатюрного изображения, добавленного в список, чтобы его можно было отобразить.
  • Если эскизы есть быть записанным в файл, сделайте это также в потоке чтения (объяснение см. выше).

Изменить:

При повторном чтении вашего вопроса я заметил, что вам, возможно, нужно изменить размер только одного изображения, и в этом случае один фоновый поток является конечно достаточно. Я все равно оставлю свой ответ на месте, может быть, когда-нибудь он будет кому-нибудь полезен. Это то, что я узнал из одного из моих последних проектов, в котором финальной программе могло потребоваться немного больше скорости, но в часы пик использовалось только около 75% четырехъядерной машины. Разделение ввода-вывода и обработки имело бы значение.

Это то, что я узнал из одного из моих последних проектов, в котором финальной программе могло потребоваться немного больше скорости, но в часы пик использовалось только около 75% четырехъядерной машины. Разделение ввода-вывода и обработки имело бы значение.

Это то, что я узнал из одного из моих последних проектов, в котором финальной программе могло потребоваться немного больше скорости, но в часы пик использовалось только около 75% четырехъядерной машины. Разделение ввода-вывода и обработки имело бы значение.

5
ответ дан 18 December 2019 в 12:01
поделиться

I'm in the vision business, and I simply upload the images to the GPU using OpenGL. (typically 20x 2048x2000x8bpp per second), a bmp per texture, and let the videocard scale (win32, Mike Lischke's opengl headers)

Upload of such an image costs 5-10ms depending on exact videocard (if not integrated and nvidia 7300 series or newer. Very recent integrated GPUs might be doable also). Scaling and displaying costs 300us. Which means customers can pan and zoom like crazy without touching the app. I draw an overlay (which used to be a tmetafile but is now an own format) on top of it.

My biggest picture is 4096x7000x8bpp which shows and scales in under 30ms. (GF 8600)

A limitation of this technology is max texture size. It can be resolved by fragmenting the picture into multiple textures, but I haven't bothered yet because I deliver the systems with the software.

(some typical sizes: nv6x00 series: 2k * 2k, но загрузка почти безубыточна по сравнению с GDI nv7x00 series: 4k * 4k Для меня базовые карты. GF7300 стоят примерно 20-40 долларов серия nv8x00: 8k * 8k )

Обратите внимание, что это может быть не для всех. Но если вам повезет указать ограничения на оборудование, это может сработать. Основная проблема - ноутбуки, такие как Thinkpads, графические процессоры которых старше, чем у портативных компьютеров avg, которые, в свою очередь, часто уступают поколениям настольных компьютеров.

Я выбрал OpenGL, а не DirectX, потому что он более статичен во времени и его легче найти - примеры, связанные с игрой.

1
ответ дан 18 December 2019 в 12:01
поделиться

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

0
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: