主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python: Exif Manipulations of JPEG(resize, transplant exif data)

                
tags: python
**************************
'14/9/14追記
https://pypi.python.org/pypi/Pyxif
**************************


I wrote a python script to manipulate exif data of JPEG image file. Functions are, to resize a image without losing exif, and to transplant exif data from a JPEG file to another JPEG file.

manipulate_exif.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
##########################################################
# manipulate_exif.get_thumbnail(src, output, size)
# src: input filename
# output: output filename
# size: list of new image size(ex. [100, 100])
#
# manipulate_exif.transplant(exif_src, image_src, output)
# exif_src: get a exif from this file
# image_src: get a image from this file
# output: filename of new JPEG

import cStringIO
from PIL import Image

def slice2segments(image_string):
head = 0
segments = {}
while 1:
if (image_string[head:head+2] == '\xff\xda'): break
if (image_string[head:head+2] == '\xff\xd8'):
head += 2
else:
length = int(image_string[head + 2:head + 4].encode('hex'), 16)
end_point = head + length + 2
seg = image_string[head:end_point]
segments.update({seg[0:2]:{'data':seg, 'from':[head, end_point]}})
head = end_point
if (head > len(image_string)): break
return segments

def get_thumbnail(src, output, size=[200, 200]):
if (type(size) != list) or (len(size) != 2):
raise

with open(src, 'rb') as f:
data = f.read()
segments = slice2segments(data)
if segments.has_key("\xff\xe1"):
start = segments["\xff\xe1"]["from"][0]
else:
start = -1
if start < 0:
if not bin_return:
im = Image.open(src)
im.thumbnail(size, Image.ANTIALIAS)
im.save(output, "JPEG")
return False
else:
new_data = cStringIO.StringIO()
im = Image.open(src)
im.thumbnail(size, Image.ANTIALIAS)
im.save(new_data, "JPEG")
return new_data
exif = segments["\xff\xe1"]["data"]

thumb = cStringIO.StringIO()
im = Image.open(src)
im.thumbnail(size, Image.ANTIALIAS)
im.save(thumb, "JPEG")

data2 = thumb.getvalue()
start2 = data2.find("\xff\xdb")
new_data = data2[0:start2] + exif + data2[start2:]

with open(output, "w+b") as f:
f.write(new_data)
return output


def transplant(exif_src, image_src, output):
with open(exif_src, 'rb') as f:
data = f.read()

segments = slice2segments(data)
if segments.has_key('\xff\xe1'):
exif_str = segments['\xff\xe1']['data']
else:
print 'exif not found: "%s"' %(exif_src)
raise
with open(image_src, 'rb') as f:
data2 = f.read()
segments2 = slice2segments(data2)
if not segments2.has_key('\xff\xe1'):
start2 = data2.find("\xff\xdb")
point = [start2, start2]
else:
point = segments2['\xff\xe1']['from']

new_data = data2[0:point[0]] + exif_str + data2[point[1]:]
with open(output, "w+b") as f:
f.write(new_data)
return False

if __name__ == "__main__":
get_thumbnail(r'C:\Users\h\Desktop\src0.jpg', r'C:\Users\h\Desktop\mini.jpg', size=[100,100])
##transplant(r'C:\Users\h\Desktop\src1.jpg', r'C:\Users\h\Desktop\src0.jpg', r'C:\Users\h\Desktop\planted.jpg')
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。