На главную
  Назад в „Автоматизация рутинных операций“  

Используем python для конвертирования изображений в base64 для CSS Data URI схемы

Увлёкшись языком программирования Python я конечно сразу захотел его использовать для автоматизации некоторых мелких задачек. Один из таких скриптов уже некоторое время облегчает мне жизнь, а значит грех не поделится наработкой. Итак задача: для всех .png изображений в текущей директории генерировать их представление в base64 в формате пригодном для использования в CSS файле в виде Data URI схемы.

Хорошее обсуждение этого подхода есть на хабре



Всё дело происходит под Ubuntu, но и под Windows (если уже установлен интерпретатор python) разницы быть не должно я думаю.

Полный код скрипта:

#!/usr/bin/env python
#Converts all images in current directory, what matches filter into his base64 strings
#If outToOneFile True, when all output will come to one file out.txt
#otherwise, for each image will be created file with name as image + '.txt'

import base64
import os, fnmatch
import re

filter = "*.png"
outToOneFile = True
#outToOneFile = False

def convert_to_base64( img_file_name ):
return base64.encodestring(open(img_file_name,"rb").read())

def save_to_file( file_name, content, png_file ):
f = open( file_name, 'a' )
# Remove from string all new line symbols
content = re.sub("\n","",content)

f.write( '\n\n\n'+png_file+'\n\nbackground-image:url(data:image/png;base64,'+content+');' )
f.close()


def locate(pattern, root=os.curdir):
'''Locate all files matching supplied filename pattern in and below
supplied root directory.'
''
for path, dirs, files in os.walk(os.path.abspath(root)):
for filename in fnmatch.filter(files, pattern):
yield os.path.join(path, filename)


for png_file in locate(filter):
# Save into one file all results
if( outToOneFile ):
save_to_file('out.txt',convert_to_base64(png_file), png_file)
else:
# Save into output file with name as source image file and appned to end .txt
save_to_file(png_file+'.txt',convert_to_base64(png_file), png_file)

 

Либо можно взять в архиве.

Как использовать.
В зависимости от переменной outToOneFile будет происходить либо сохранение всех результатов в один файл 'out.txt' (действие по умолчанию, так — как мне так удобнее), либо, если outToOneFile = False, тогда для каждого png файла будет создан текстовый файл с его именем. Задаём скрипту атрибут Executable, кидаем в директорию с ним целевые png изображения и запускаем файл. Всё. Создаётся файл 'out.txt' содержащий base64 представление для каждого png файла. К примеру, российский флаг будет выглядеть следующим образом:

/home/pavel/Desktop/py/base64/rus.png - название png файла, чтобы удобнее ориентироваться если конвертировать сразу много.

background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADAUExURbe3t6ZYY+Li4oQUIixBvff39wYsg0JVxMzMzPT09JgZJz1RwvLy8iU6ujlNwR0zuOzs7Orq6ufn5+jo6DZKwOTk5MkmNDBEvbojMd3d3dnZ2QUsfik+vDRJvwc1pEZYxcYpNL6+voISHw8yq5hATVJkyU1exyA2uUhaxwcvkMsqN//9/kBTyY8XJbOzs/z8+vb29PX08A0sgf7+/v39/fz8/Pr6+vj4+PDu7+Xn5BMxr8fHxxowtwk0pcooNVpkbsQMuoIAAABAdFJOU////////////////////////////////////////////////////////////////////////////////////wDCe7FEAAAA8UlEQVR42mSQfVeCMBSHFySGGzJLQnmp0BJzESUbUG7x/b9Vd0w6cnr+ubvPuWfb/aHO8J7dnDJ0bkzNgjsK3FroT0bWonU1pF2sIyOjgJJJUwONS6i17mVA3aYWgnNR1hNCe3mipCl5peFCWwTyq/0oOWMVqyrGRP3ZWh06qnCO97uXnt3+DacPDnJ873o5x9NHYIpxGiZ5jF6lzL0wTJcAmCSX0tFSbpUmSTwflPRj5MhvNbAFJZWK4aF/HFE3+xlzP4N/2gc4XFpbr1mMJ22T0uiCYsizeDLi0M8NIW+KlZarYnORfNc928DVufkVYACKk0fGL5gFVAAAAABJRU5ErkJggg==);


Вот и всё!
Успешной, приятной и эффективной работы!

Павел Осипов
2011.08.13



  Наверх