Найти - Пользователи
Полная версия: Можно ли сохранить файл .png в виде двоичного файла?
Начало » Python для новичков » Можно ли сохранить файл .png в виде двоичного файла?
1
panama555
Привет!
Подскажите, можно ли сохранить графический файл png, bmp, jpg в виде двоичного файла?
Предположим у меня есть несколько графических файлов которые я использую в программе.
Я хочу открыть их и сохранить в один бинарный файл, например, с помощью pickle.
Есть ли такая возможность или нет?
AD0DE412
panama555
можно ли сохранить графический файл png, bmp, jpg
а они какие по вашему
panama555
Я хочу открыть их и сохранить в один бинарный файл, например, с помощью pickle.
не доводилось но вроде можно (pickle сохраняет объекты если не ошибаюсь) опять же shelve есть
FishHook
Графические файлы png, bmp, jpg и так представляют из себя двоичные файлы. Если вы хотите преобразовать внутренне представление предоставляемое конкретным форматом в некий свой набор байт, то решать вам надо эту задачу, а не “Есть ли такая возможность”. Сохранить в файл вы можете что угодно - любой набор нулей и единиц.
panama555
Видимо я не совсем точно выразился. Ещё раз:
 s=[1,2,3,4]
save_file = open('save.dat', 'wb')
pickle.dump(game_data, save_file)
В этом примере используя pickle я сохраняю в бинарный файл объект(список)
Но если я попытаюсь сохранить подобным образом объект (файл) будет ошибка
 s=pygame.image.load(file.png)
save_file = open('save.dat', 'wb')
pickle.dump(s, save_file)
Поэтому появляется вопрос: возможно ли стандартными средствами в бинарный файл save.dat(pickle) сохранить объект- графический файл(png).
Ещё раз подчёркиваю - можно ли добиться этого стандартными средствами, не изобретая велосипед.
Или же без велосипеда не обойтись?
FishHook
panama555
Поэтому появляется вопрос: возможно ли стандартными средствами в бинарный файл save.dat(pickle) сохранить объект- графический файл(png).
Ещё раз подчёркиваю - можно ли добиться этого стандартными средствами, не изобретая велосипед.
Или же без велосипеда не обойтись?
Блин, да какой смысл сохранять в файл объект файла?
Во-первых, сделав open('save.dat', ‘wb’) вы ничего с диска еще не прочитали, вы только создали сокет и передали его дескриптор в программу. Что по-вашему должно сохраниться в виде pickle.dump - номер дескриптора? Это бессмысленно.
Если же вы все-таки решитесь файл прочитать, чтобы извлечь данные из диска в память, то эти данные у вас будут храниться не в объекте файла.
 with open("myfile", "rb") as f:
    byte = f.read(1) # байт здесь
    while byte:
        byte = f.read(1) # байт здесь
Объект файла - это сокет через который вы получите свои байты и по выходе из контекста этот сокет закроется и потеряет смысл. Представьте, что этот объект файла это дырка в ведре, через которую течет вода. Вы воду хотите сохранить или дырку?
panama555
 import pickle,pygame
s=open("file.png","rb")
a=s.read()
s.close()
save_file = open('save.dat', 'wb')
pickle.dump(a, save_file)
save_file.close()
Я сохранил файл-png в dat-файл таким образом.
И могу теперь его загрузить в другой программе.
Теперь вопрос: как в программе загрузить этот dat-файл, чтобы программа могла его использовать как png-файл,
т.е. вывести его на экран в виде изображения
PEHDOM
panama555
panama555
Я сохранил файл-png в dat-файл таким образом.
обьясните мне смысл такого преобразования? откройте в heх редакторе оба файла и посмотрите разницу.
panama555
Теперь вопрос: как в программе загрузить этот dat-файл, чтобы программа могла его использовать как png-файл,
ну вы же понимаете что ничего по сути вы не сделали, у вас на выходе вышел такой же png плюс десяток байт от пикла. Вы ведь в курсе что в PNG -формате данные сжимаються\кодируются и чтобы получить картинку нужно эти данные распаковать согласно аогоритму PNG-cжатия. Если вы сделаете pickle.loads то просто получите кучу байт. Вам нужно всервно получить обьект через BytesIO() и скормить его уже pygame.image.load-у, котороый уже преобразует сжатые данные в пикселы.
Если так уж припекло хранить все в одном файле, зачем вам вообще пикл? что мешает хранить все файлы , например в zip архиве? Читаете через zipfile(там теже яйца что и просто с ФС только в профиль, есть open, read и тд…), а в случае необходимости, добавить\удалить файлы можно практически любым архиватором.

Еще вариант именно с пайгемом, посмотрите в сторону pygame.image.fromstring()/ pygame.image.frombuffer() и pygame.image.tostring(). открываете картинку черз pygame.image.load, загоняете в словарь через pygame.image.tostring(). словарь сохраняете pikle-ом или shelve-ом(почемуто я уверен что про сжатие придеться забыть, хотя ХЗ нужно экспериментировать). Потом также их читаете и загоняете сразу в пайгейм pygame.image.fromtring-ом или pygame.image.frombuffer-ом. По крайней мере избавитесь от посредника в виде BytesIO/StringIO.



panama555
PEHDOM
Еще вариант именно с пайгемом, посмотрите в сторону pygame.image.fromstring()/ pygame.image.frombuffer() и pygame.image.tostring(). открываете картинку черз pygame.image.load, загоняете в словарь через pygame.image.tostring().
Вот это ближе к телу!
Обязательно попробую.
Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB