1
0
mirror of https://github.com/arsenetar/dupeguru.git synced 2024-11-18 04:59:03 +00:00
dupeguru/pe/qt/modules/block/block.pyx
hsoft 90e2e43f3e [#67 state:fixed] Fixed block.pyx so it takes Qt pixel alignment into account.
--HG--
extra : convert_revision : svn%3Ac306627e-7827-47d3-bdf0-9a457c9553a1/trunk%40172
2009-10-03 11:49:53 +00:00

52 lines
2.0 KiB
Cython

# $Id$
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "HS" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/hs_license
cdef object getblock(object image):
cdef int width, height, pixel_count, red, green, blue, i, offset, bytes_per_line
cdef char *s
cdef unsigned char r, g, b
width = image.width()
height = image.height()
if width:
pixel_count = width * height
red = green = blue = 0
bytes_per_line = image.bytesPerLine()
tmp = image.bits().asstring(image.numBytes())
s = tmp
# Qt aligns all its lines on 32bit, which means that if the number of bytes per
# line for image is not divisible by 4, there's going to be crap inserted in "s"
# We have to take this into account when calculating offsets
for i in range(height):
for j in range(width):
offset = i * bytes_per_line + j * 3
r = s[offset]
g = s[offset + 1]
b = s[offset + 2]
red += r
green += g
blue += b
return (red // pixel_count, green // pixel_count, blue // pixel_count)
else:
return (0, 0, 0)
def getblocks(image, int block_count_per_side):
cdef int width, height, block_width, block_height, ih, iw, top, left
width = image.width()
height = image.height()
if not width:
return []
block_width = max(width // block_count_per_side, 1)
block_height = max(height // block_count_per_side, 1)
result = []
for ih in range(block_count_per_side):
top = min(ih*block_height, height-block_height-1)
for iw in range(block_count_per_side):
left = min(iw*block_width, width-block_width-1)
crop = image.copy(left, top, block_width, block_height)
result.append(getblock(crop))
return result