Использование Python для обработки изображений в хранилище BLOB-объектов Azure - PullRequest
0 голосов
/ 14 марта 2019

У меня в хранилище больших двоичных объектов хранятся тысячи изображений. Я хочу обработать эти изображения одно за другим в Python и выложить новые изображения в новый контейнер (процесс в основном обнаруживает и редактирует объекты). Локальная загрузка изображений невозможна, поскольку они занимают слишком много места.

До сих пор я смог подключиться к BLOB-объекту и создал новый контейнер для хранения обработанных изображений, но я не знаю, как запустить код для обработки изображений и сохранить их в новом контейнере. Кто-нибудь может помочь с этим?

Код до сих пор:

from azure.storage.file import FileService
from azure.storage.blob import BlockBlobService

# call blob service for the storage acct
block_blob_service = BlockBlobService(account_name = 'mycontainer', account_key = 'HJMEchn')

# create new container to store processed images
container_name = 'new_images'
block_blob_service.create_container(container_name)

Нужно ли использовать get_blob_to_stream или get_blob_to_path отсюда: https://azure -storage.readthedocs.io / ref / azure.storage.blob.baseblobservice.html , поэтому мне не нужно загружать изображения?

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 15 марта 2019

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

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

Загрузка BLOB-объектов :

# Download the blob(s).
# Add '_DOWNLOADED' as prefix to '.txt' so you can see both files in Documents.
full_path_to_file2 = os.path.join(local_path, string.replace(local_file_name ,'.txt', '_DOWNLOADED.txt'))
print("\nDownloading blob to " + full_path_to_file2)
block_blob_service.get_blob_to_path(container_name, local_file_name, full_path_to_file2)

Загрузка BLOB-объектов в контейнер :

# Create a file in Documents to test the upload and download.
local_path=os.path.expanduser("~\Documents")
local_file_name ="QuickStart_" + str(uuid.uuid4()) + ".txt"
full_path_to_file =os.path.join(local_path, local_file_name)

# Write text to the file.
file = open(full_path_to_file,  'w')
file.write("Hello, World!")
file.close()

print("Temp file = " + full_path_to_file)
print("\nUploading to Blob storage as blob" + local_file_name)

# Upload the created file, use local_file_name for the blob name
block_blob_service.create_blob_from_path(container_name, local_file_name, full_path_to_file)

Обновление :

Попробуйте использовать код по потоку, как показано ниже, для более подробной информации вы можете увидеть две ссылки: link1 и link2 (они связанывопрос, вы могли видеть их вместе).

from azure.storage.blob import BlockBlobService
from io import BytesIO
from shutil import copyfileobj 
with BytesIO() as input_blob:
    with BytesIO() as output_blob:
        block_blob_service = BlockBlobService(account_name='my_account_name', account_key='my_account_key')
        # Download as a stream
        block_blob_service.get_blob_to_stream('mycontainer', 'myinputfilename', input_blob)

        # Do whatever you want to do - here I am just copying the input stream to the output stream
        copyfileobj(input_blob, output_blob)
        ...

        # Create the a new blob
        block_blob_service.create_blob_from_stream('mycontainer', 'myoutputfilename', output_blob)

        # Or update the same blob
        block_blob_service.create_blob_from_stream('mycontainer', 'myinputfilename', output_blob)
...