Added check for wide cover, and allow for only checking right side

git-svn-id: http://comictagger.googlecode.com/svn/trunk@55 6c5673fe-1810-88d6-992b-cd32ca31540c
This commit is contained in:
beville@gmail.com 2012-11-17 04:36:03 +00:00
parent 9f9d9a2635
commit 47a61885d9

View File

@ -21,6 +21,8 @@ limitations under the License.
import sys
import math
import urllib2, urllib
import StringIO
import Image
from settings import ComicTaggerSettings
from comicvinecacher import ComicVineCacher
@ -89,6 +91,26 @@ class IssueIdentifier:
else:
return ImageHasher( data=image_data ).average_hash()
def getAspectRatio( self, image_data ):
im = Image.open(StringIO.StringIO(image_data))
w,h = im.size
return float(h)/float(w)
def cropCover( self, image_data ):
im = Image.open(StringIO.StringIO(image_data))
w,h = im.size
cropped_im = im.crop( (int(w/2), 0, w, h) )
output = StringIO.StringIO()
cropped_im.save(output, format="JPEG")
cropped_image_data = output.getvalue()
output.close()
return cropped_image_data
def setProgressCallback( self, cb_func ):
self.callback = cb_func
@ -178,9 +200,18 @@ class IssueIdentifier:
return self.ResultNoMatches, []
cover_image_data = ca.getCoverPage()
cover_hash = self.calculateHash( cover_image_data )
#check the apect ratio
# if it's wider than it is high, it's probably a two page spread
# if so, crop it and calculate a second hash
narrow_cover_hash = None
aspect_ratio = self.getAspectRatio( cover_image_data )
if aspect_ratio < 1.0:
right_side_image_data = self.cropCover( cover_image_data )
narrow_cover_hash = self.calculateHash( right_side_image_data )
print "narrow_cover_hash", narrow_cover_hash
#self.log_msg( "Cover hash = {0:016x}".format(cover_hash) )
keys = self.getSearchKeys()
@ -190,7 +221,7 @@ class IssueIdentifier:
self.log_msg("Not enough info for a search!")
return []
"""
self.log_msg( "Going to search for:" )
self.log_msg( "Series: " + keys['series'] )
self.log_msg( "Issue : " + keys['issue_number'] )
@ -198,6 +229,7 @@ class IssueIdentifier:
self.log_msg( "Year : " + keys['year'] )
if keys['month'] is not None:
self.log_msg( "Month : " + keys['month'] )
"""
comicVine = ComicVineTalker( self.cv_api_key )
@ -280,10 +312,16 @@ class IssueIdentifier:
return self.match_list
url_image_hash = self.calculateHash( url_image_data )
score = ImageHasher.hamming_distance(cover_hash, url_image_hash)
# if we have a cropped version of the cover, check that one also, and use the best score
if narrow_cover_hash is not None:
score2 = ImageHasher.hamming_distance(narrow_cover_hash, url_image_hash)
score = min( score, score2 )
match = dict()
match['series'] = "{0} ({1})".format(series['name'], series['start_year'])
match['distance'] = ImageHasher.hamming_distance(cover_hash, url_image_hash)
match['distance'] = score
match['issue_number'] = num_s
match['url_image_hash'] = url_image_hash
match['issue_title'] = issue['name']