<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=PNGFileFormat%2FFormatUnitTestInPythonLanguage</id>
	<title>PNGFileFormat/FormatUnitTestInPythonLanguage - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=PNGFileFormat%2FFormatUnitTestInPythonLanguage"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=PNGFileFormat/FormatUnitTestInPythonLanguage&amp;action=history"/>
	<updated>2026-05-15T02:19:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=PNGFileFormat/FormatUnitTestInPythonLanguage&amp;diff=37432&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=PNGFileFormat/FormatUnitTestInPythonLanguage&amp;diff=37432&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; #format python&lt;br /&gt;
 &lt;br /&gt;
 #---------------- pngtest.py -------------------------------------------&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 &lt;br /&gt;
 import unittest&lt;br /&gt;
 import zlib&lt;br /&gt;
 import Image&lt;br /&gt;
 import misc&lt;br /&gt;
 &lt;br /&gt;
 from ThomPNG import *&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 class TestPngFormat(unittest.TestCase):&lt;br /&gt;
 	def setUp(self):&lt;br /&gt;
 		self.png = ThomPNG(&amp;#039;tmp.png&amp;#039;)&lt;br /&gt;
 	&lt;br /&gt;
 	def tearDown(self):&lt;br /&gt;
 		self.png.close()&lt;br /&gt;
 &lt;br /&gt;
 	def testFirstEightBytes(self):&lt;br /&gt;
 		#eightBytesFromFile = self.png.firstEightBytes()&lt;br /&gt;
 &lt;br /&gt;
 		eightBytes = [137,80,78,71,13,10,26,10]&lt;br /&gt;
 &lt;br /&gt;
 		eightBytesFromFile = self.png.firstEightBytes()&lt;br /&gt;
 		&lt;br /&gt;
 		for i in range(8):&lt;br /&gt;
 			self.assertEqual( chr(eightBytes[i]), eightBytesFromFile[i] )&lt;br /&gt;
 &lt;br /&gt;
 	def testChunkLength(self):&lt;br /&gt;
 		chunkInfo = self.png.nextChunk()&lt;br /&gt;
 &lt;br /&gt;
 		self.assertEqual(13, chunkInfo[0])	# 0 = chunkLen&lt;br /&gt;
 	&lt;br /&gt;
 	def testImageIHDR(self):&lt;br /&gt;
 		im = Image.open(self.png.f.name)&lt;br /&gt;
 &lt;br /&gt;
 		chunkInfo = self.png.nextChunk()&lt;br /&gt;
 		&lt;br /&gt;
 		# Width&lt;br /&gt;
 		imageWidth = ord(chunkInfo[2][0]) * (256**3)&lt;br /&gt;
 		imageWidth += ord(chunkInfo[2][1]) * (256**2)&lt;br /&gt;
 		imageWidth += ord(chunkInfo[2][2]) * (256**1)&lt;br /&gt;
 		imageWidth += ord(chunkInfo[2][3])&lt;br /&gt;
 &lt;br /&gt;
 		self.assertEqual(im.size[0], imageWidth)&lt;br /&gt;
 &lt;br /&gt;
 		# Height&lt;br /&gt;
 		imageHeight = ord(chunkInfo[2][4]) * (256**3)&lt;br /&gt;
 		imageHeight += ord(chunkInfo[2][5]) * (256**2)&lt;br /&gt;
 		imageHeight += ord(chunkInfo[2][6]) * (256**1)&lt;br /&gt;
 		imageHeight += ord(chunkInfo[2][7])&lt;br /&gt;
 &lt;br /&gt;
 		self.assertEqual(im.size[1], imageHeight)&lt;br /&gt;
 &lt;br /&gt;
 		# BitDepth&lt;br /&gt;
 		bitDepth = ord(chunkInfo[2][8])&lt;br /&gt;
 		self.assertEqual(True, bitDepth in [1,2,4,8,16])&lt;br /&gt;
 &lt;br /&gt;
 		# ColorType&lt;br /&gt;
 		colorType = ord(chunkInfo[2][9])&lt;br /&gt;
 		self.assertEqual(True, colorType in [0,2,3,4,6])&lt;br /&gt;
 &lt;br /&gt;
 		# CompressionMethod&lt;br /&gt;
 		compressionMethod = ord(chunkInfo[2][10])&lt;br /&gt;
 &lt;br /&gt;
 		# Filter Method&lt;br /&gt;
 		filterMethod = ord(chunkInfo[2][11])&lt;br /&gt;
 &lt;br /&gt;
 		# InterlaceMethod&lt;br /&gt;
 		interlaceMethod = ord(chunkInfo[2][12])&lt;br /&gt;
 &lt;br /&gt;
 		print &amp;#039;\nBitDepth, ColorType, CompressionMethod, FilterMethod = (%d, %d, %d, %d, %d)&amp;#039; \&lt;br /&gt;
 				% (bitDepth, colorType, compressionMethod, filterMethod, interlaceMethod)&lt;br /&gt;
 &lt;br /&gt;
 	&lt;br /&gt;
 	def testImageDataSize(self):&lt;br /&gt;
 		self.png.nextChunk()	# IHDR 부분 건너뛰기&lt;br /&gt;
 &lt;br /&gt;
 		totalSize = 0&lt;br /&gt;
 		loop=0&lt;br /&gt;
 				&lt;br /&gt;
 		while True:&lt;br /&gt;
 			loop+=1&lt;br /&gt;
 &lt;br /&gt;
 			chunkInfo = self.png.nextChunk()&lt;br /&gt;
 &lt;br /&gt;
 			if chunkInfo[1] != &amp;#039;IDAT&amp;#039;:&lt;br /&gt;
 				self.assertEqual(&amp;#039;IEND&amp;#039;, chunkInfo[1])&lt;br /&gt;
 				self.assertEqual(0, chunkInfo[0])&lt;br /&gt;
 				break&lt;br /&gt;
 			&lt;br /&gt;
 			totalSize += chunkInfo[0]&lt;br /&gt;
 &lt;br /&gt;
 		# 전체 파일 크기와 비교.&lt;br /&gt;
 		#self.assertEqual(224975, 8+4+4+13+4+(12*loop)+totalSize)&lt;br /&gt;
 &lt;br /&gt;
 	def testRGB(self):&lt;br /&gt;
 		rgb = RGB(1,1,1)&lt;br /&gt;
 		self.assertEqual((1,1,1), rgb)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	# CRC 테스트&lt;br /&gt;
 	def testCRC(self):&lt;br /&gt;
 		chunkInfo = self.png.nextChunk()&lt;br /&gt;
 		fileCRC = chunkInfo[3]&lt;br /&gt;
 		computedCRC = self.png.computeCRC(chunkInfo[1]+chunkInfo[2])&lt;br /&gt;
 &lt;br /&gt;
 		expectedCRC = [(computedCRC&amp;amp;amp;0xff000000)&amp;amp;gt;&amp;amp;gt;24,(computedCRC&amp;amp;amp;0x00ff0000)&amp;amp;gt;&amp;amp;gt;16,(computedCRC&amp;amp;amp;0x0000ff00)&amp;amp;gt;&amp;amp;gt;8,(computedCRC&amp;amp;amp;0x000000ff)]&lt;br /&gt;
 		fileCRCInNum = [ord(fileCRC[0]), ord(fileCRC[1]), ord(fileCRC[2]), ord(fileCRC[3])]&lt;br /&gt;
 &lt;br /&gt;
 		self.assertEqual(expectedCRC, fileCRCInNum)&lt;br /&gt;
 &lt;br /&gt;
 	def testPaeth(self):&lt;br /&gt;
 		self.assertEqual(10, self.png.paethDictor(10,11,12))&lt;br /&gt;
 		self.assertEqual(87, self.png.paethDictor(0,87,0))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	# PIL과 비교. scanline by scanline 으로 비교해야 한다.&lt;br /&gt;
 	def testCompareWithPIL(self):&lt;br /&gt;
 		im = Image.open(self.png.f.name)&lt;br /&gt;
 &lt;br /&gt;
 		zlibdata = self.png.getData()&lt;br /&gt;
 		base = [ord(zlibdata[1]), ord(zlibdata[2]), ord(zlibdata[3])]&lt;br /&gt;
 &lt;br /&gt;
 		rgbmap = []&lt;br /&gt;
 &lt;br /&gt;
 		for i in range(im.size[1]):&lt;br /&gt;
 			idx = self.png.getIdx(0,i)-1&lt;br /&gt;
 			scanline = self.png.makeScanline(base, i, zlibdata, rgbmap )&lt;br /&gt;
 			rgbmap.append(scanline)&lt;br /&gt;
 			self.assertTrue(len(rgbmap)&amp;amp;gt;0)&lt;br /&gt;
 &lt;br /&gt;
 		for j in range(im.size[1]):&lt;br /&gt;
 			for i in range(im.size[0]) :&lt;br /&gt;
 				self.assertTrue(rgbmap[j][i].compare(im.getpixel((i,j)) ) )&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 if __name__==&amp;#039;__main__&amp;#039;:&lt;br /&gt;
 	print &amp;#039;\n&amp;#039;&lt;br /&gt;
 	print &amp;#039;----------------------------------------&amp;#039;&lt;br /&gt;
 	print &amp;#039;          PNG Format TEST&amp;#039;&lt;br /&gt;
 	print &amp;#039;----------------------------------------&amp;#039;&lt;br /&gt;
 	print &amp;#039;\n&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 	unittest.main(argv=(&amp;#039;&amp;#039;, &amp;#039;-v&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #---------------- ThomPNG.py -------------------------------------------&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 &lt;br /&gt;
 import Image&lt;br /&gt;
 import zlib&lt;br /&gt;
 &lt;br /&gt;
 class ThomPNG:&lt;br /&gt;
 	def __init__(self, filename):&lt;br /&gt;
 		self.f = file(filename, &amp;#039;r&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
 		self.leadingEightBytes = None&lt;br /&gt;
 		self.firstEightBytes()&lt;br /&gt;
 		self.crc = CRC()&lt;br /&gt;
 		self.data = None; self.width = None; self.height = None; self.bitDepth = None&lt;br /&gt;
 &lt;br /&gt;
 	def close(self):&lt;br /&gt;
 		self.f.close()&lt;br /&gt;
 &lt;br /&gt;
 	def firstEightBytes(self):&lt;br /&gt;
 		if self.leadingEightBytes == None:&lt;br /&gt;
 			self.leadingEightBytes = self.f.read(8)&lt;br /&gt;
 &lt;br /&gt;
 		return self.leadingEightBytes&lt;br /&gt;
 &lt;br /&gt;
 	def nextChunk(self):&lt;br /&gt;
 		buff = self.f.read(8)&lt;br /&gt;
 		chunkType = buff[4:]&lt;br /&gt;
 &lt;br /&gt;
 		chunkLen = ord(buff[0]) * (256 ** 3 )&lt;br /&gt;
 		chunkLen += ord(buff[1]) * (256 ** 2 )&lt;br /&gt;
 		chunkLen += ord(buff[2]) * (256)&lt;br /&gt;
 		chunkLen += ord(buff[3])&lt;br /&gt;
 &lt;br /&gt;
 		chunk = self.f.read(chunkLen)&lt;br /&gt;
 &lt;br /&gt;
 		if chunkType == &amp;#039;IHDR&amp;#039;:&lt;br /&gt;
 			self.makeInfo(chunk)&lt;br /&gt;
 &lt;br /&gt;
 		crc = self.f.read(4)&lt;br /&gt;
 &lt;br /&gt;
 		return [chunkLen, chunkType, chunk, crc]&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	def makeInfo(self, chunk):	#width, height 등의 정보 얻기&lt;br /&gt;
 		# Width&lt;br /&gt;
 		self.width = ord(chunk[0]) * (256**3)&lt;br /&gt;
 		self.width += ord(chunk[1]) * (256**2)&lt;br /&gt;
 		self.width += ord(chunk[2]) * (256**1)&lt;br /&gt;
 		self.width += ord(chunk[3])&lt;br /&gt;
 		# Height&lt;br /&gt;
 		self.height = ord(chunk[4]) * (256**3)&lt;br /&gt;
 		self.height += ord(chunk[5]) * (256**2)&lt;br /&gt;
 		self.height += ord(chunk[6]) * (256**1)&lt;br /&gt;
 		self.height += ord(chunk[7])&lt;br /&gt;
 &lt;br /&gt;
 	def getData(self):&lt;br /&gt;
 		if self.data != None:&lt;br /&gt;
 			return self.data&lt;br /&gt;
 		&lt;br /&gt;
 		self.nextChunk()	# IHDR 읽기&lt;br /&gt;
 	&lt;br /&gt;
 		# PLTE 등은 아직..&lt;br /&gt;
 		# ...&lt;br /&gt;
 &lt;br /&gt;
 		self.data = &amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 		while True:&lt;br /&gt;
 			chunks = self.nextChunk()&lt;br /&gt;
 			&lt;br /&gt;
 			if chunks[1]!= &amp;#039;IDAT&amp;#039;:&lt;br /&gt;
 				break&lt;br /&gt;
 			&lt;br /&gt;
 			self.data += chunks[2]&lt;br /&gt;
 		&lt;br /&gt;
 		self.data = zlib.decompress(self.data)&lt;br /&gt;
 		return self.data&lt;br /&gt;
 	&lt;br /&gt;
 &lt;br /&gt;
 	def computeCRC(self, buf):&lt;br /&gt;
 		return self.crc.getCRC(buf)&lt;br /&gt;
 &lt;br /&gt;
 	def makeScanline(self, basepixel, ypos, stream, rgbmap):	# method 는 PNG filter type, stream은 zlib 으로 decomposite된 값들&lt;br /&gt;
 		idx = self.getIdx(0, ypos)-1&lt;br /&gt;
 		method = ord(stream[idx])&lt;br /&gt;
 &lt;br /&gt;
 		if method == 0:&lt;br /&gt;
 			pass&lt;br /&gt;
 		elif method == 1:	# sub&lt;br /&gt;
 			return self.makeScanlineBySub(basepixel, ypos, stream)&lt;br /&gt;
 		elif method == 2:&lt;br /&gt;
 			return self.makeScanlineByUp(basepixel, ypos, stream, rgbmap)&lt;br /&gt;
 		elif method == 3:&lt;br /&gt;
 			return self.makeScanlineByAverage(basepixel, ypos, stream, rgbmap)&lt;br /&gt;
 		elif method == 4:	#paeth&lt;br /&gt;
 			return self.makeScanlineByPaeth(basepixel, ypos, stream, rgbmap)&lt;br /&gt;
 	&lt;br /&gt;
 	def makeScanlineBySub(self, basepixel, ypos, stream):&lt;br /&gt;
 		scanline = []&lt;br /&gt;
 		for i in range(self.width):&lt;br /&gt;
 			idx = self.getIdx(i, ypos)&lt;br /&gt;
 			filteredR = ord(stream[idx])&lt;br /&gt;
 			filteredG = ord(stream[idx+1])&lt;br /&gt;
 			filteredB = ord(stream[idx+2])&lt;br /&gt;
 			&lt;br /&gt;
 			if i &amp;amp;gt; 0 :	# 인덱스가 0이 아닐 경우는 옆칸에서 더한다.&lt;br /&gt;
 				filteredR += scanline[i-1].r&lt;br /&gt;
 				filteredG += scanline[i-1].g&lt;br /&gt;
 				filteredB += scanline[i-1].b&lt;br /&gt;
 &lt;br /&gt;
 			rgbs = self.pureRGB(filteredR, filteredG, filteredB)&lt;br /&gt;
 			scanline.append(RGB(rgbs[0], rgbs[1], rgbs[2]) )&lt;br /&gt;
 &lt;br /&gt;
 		return scanline&lt;br /&gt;
 &lt;br /&gt;
 	def makeScanlineByUp(self, basepixel, ypos, stream, rgbmap):&lt;br /&gt;
 		scanline = []&lt;br /&gt;
 		for i in range(self.width):&lt;br /&gt;
 			idx = self.getIdx(i, ypos)&lt;br /&gt;
 			filteredR = ord(stream[idx])&lt;br /&gt;
 			filteredG = ord(stream[idx+1])&lt;br /&gt;
 			filteredB = ord(stream[idx+2])&lt;br /&gt;
 &lt;br /&gt;
 			if ypos &amp;amp;gt; 0 :	# y가 0 이면 윗칸에서 더할수 없지만 0보다 크면 더해야한다&lt;br /&gt;
 				filteredR += rgbmap[-1][i].r&lt;br /&gt;
 				filteredG += rgbmap[-1][i].g&lt;br /&gt;
 				filteredB += rgbmap[-1][i].b&lt;br /&gt;
 			&lt;br /&gt;
 			rgbs = self.pureRGB(filteredR, filteredG, filteredB)&lt;br /&gt;
 			scanline.append(RGB(rgbs[0], rgbs[1], rgbs[2]) )&lt;br /&gt;
 		return scanline&lt;br /&gt;
 &lt;br /&gt;
 	def makeScanlineByAverage(self, basepixel, ypos, stream, rgbmap):&lt;br /&gt;
 		scanline = []&lt;br /&gt;
 		for i in range(self.width):&lt;br /&gt;
 			idx = self.getIdx(i, ypos)&lt;br /&gt;
 			filteredR = ord(stream[idx])&lt;br /&gt;
 			filteredG = ord(stream[idx+1])&lt;br /&gt;
 			filteredB = ord(stream[idx+2])&lt;br /&gt;
 &lt;br /&gt;
 			leftR = 0; leftG = 0; leftB = 0&lt;br /&gt;
 			upR = 0; upG = 0; upB = 0&lt;br /&gt;
 &lt;br /&gt;
 			if ypos &amp;amp;gt; 0 :&lt;br /&gt;
 				upR = rgbmap[-1][i].r&lt;br /&gt;
 				upG = rgbmap[-1][i].g&lt;br /&gt;
 				upB = rgbmap[-1][i].b&lt;br /&gt;
 			if i &amp;amp;gt; 0 :&lt;br /&gt;
 				leftR = scanline[i-1].r&lt;br /&gt;
 				leftG = scanline[i-1].g&lt;br /&gt;
 				leftB = scanline[i-1].b&lt;br /&gt;
 &lt;br /&gt;
 			filteredR += self.floor((leftR+upR)/2.0)&lt;br /&gt;
 			filteredG += self.floor((leftG+upG)/2.0)&lt;br /&gt;
 			filteredB += self.floor((leftB+upB)/2.0)&lt;br /&gt;
 &lt;br /&gt;
 			rgbs = self.pureRGB(filteredR, filteredG, filteredB)&lt;br /&gt;
 			scanline.append(RGB(rgbs[0], rgbs[1], rgbs[2]) )&lt;br /&gt;
 &lt;br /&gt;
 		return scanline&lt;br /&gt;
 &lt;br /&gt;
 	def makeScanlineByPaeth(self, basepixel, ypos, stream, rgbmap):&lt;br /&gt;
 		scanline = []&lt;br /&gt;
 		for i in range(self.width):&lt;br /&gt;
 			idx = self.getIdx(i, ypos)&lt;br /&gt;
 			filteredR = ord(stream[idx])&lt;br /&gt;
 			filteredG = ord(stream[idx+1])&lt;br /&gt;
 			filteredB = ord(stream[idx+2])&lt;br /&gt;
 			&lt;br /&gt;
 			if i == 0 and ypos &amp;amp;gt; 0 :&lt;br /&gt;
 				filteredR += self.paethDictor(0, rgbmap[-1][i].r, 0)&lt;br /&gt;
 				filteredG += self.paethDictor(0, rgbmap[-1][i].g, 0)&lt;br /&gt;
 				filteredB += self.paethDictor(0, rgbmap[-1][i].b, 0)&lt;br /&gt;
 			else:&lt;br /&gt;
 				if ypos == 0 :&lt;br /&gt;
 					filteredR += self.paethDictor(scanline[i-1].r, 0, 0)&lt;br /&gt;
 					filteredG += self.paethDictor(scanline[i-1].g, 0, 0)&lt;br /&gt;
 					filteredB += self.paethDictor(scanline[i-1].b, 0, 0)&lt;br /&gt;
 				else:&lt;br /&gt;
 					filteredR += self.paethDictor(scanline[i-1].r, rgbmap[-1][i].r, rgbmap[-1][i-1].r)&lt;br /&gt;
 					filteredG += self.paethDictor(scanline[i-1].g, rgbmap[-1][i].g, rgbmap[-1][i-1].g)&lt;br /&gt;
 					filteredB += self.paethDictor(scanline[i-1].b, rgbmap[-1][i].b, rgbmap[-1][i-1].b)&lt;br /&gt;
 &lt;br /&gt;
 			rgbs = self.pureRGB(filteredR, filteredG, filteredB)&lt;br /&gt;
 			scanline.append(RGB(rgbs[0], rgbs[1], rgbs[2]) )&lt;br /&gt;
 &lt;br /&gt;
 		return scanline&lt;br /&gt;
 &lt;br /&gt;
 	def pureRGB(self, r, g, b):&lt;br /&gt;
 		if r &amp;amp;gt;= 256 : r -= 256&lt;br /&gt;
 		if g &amp;amp;gt;= 256 : g -= 256&lt;br /&gt;
 		if b &amp;amp;gt;= 256 : b -= 256&lt;br /&gt;
 		if r &amp;amp;lt; 0 : r += 256&lt;br /&gt;
 		if g &amp;amp;lt; 0 : g += 256&lt;br /&gt;
 		if b &amp;amp;lt; 0 : b += 256&lt;br /&gt;
 &lt;br /&gt;
 		return (r, g, b)&lt;br /&gt;
 &lt;br /&gt;
 	def paethDictor(self, a, b, c):&lt;br /&gt;
 		p = a + b - c&lt;br /&gt;
 		pa = abs(p-a)&lt;br /&gt;
 		pb = abs(p-b)&lt;br /&gt;
 		pc = abs(p-c)&lt;br /&gt;
 &lt;br /&gt;
 		if pa&amp;amp;lt;=pb and pa&amp;amp;lt;=pc: return a&lt;br /&gt;
 		elif pb&amp;amp;lt;=pc : return b&lt;br /&gt;
 		else : return c&lt;br /&gt;
 		&lt;br /&gt;
 &lt;br /&gt;
 	def getIdx(self, x,y):&lt;br /&gt;
 		base = ( self.height * 3 * y ) +  (y +1)&lt;br /&gt;
 		idx = base + 3 * x&lt;br /&gt;
 		return idx&lt;br /&gt;
 &lt;br /&gt;
 	def floor(self, x):&lt;br /&gt;
 		if x %1.0  == 0.0:&lt;br /&gt;
 			return int(round(x))&lt;br /&gt;
 		else:&lt;br /&gt;
 			return int(round(x+1))&lt;br /&gt;
 &lt;br /&gt;
 	&lt;br /&gt;
 &lt;br /&gt;
 class CRC:&lt;br /&gt;
 	def __init__(self):&lt;br /&gt;
 		self.crcTable = 0 &lt;br /&gt;
 		self.makeCRCTable()&lt;br /&gt;
 &lt;br /&gt;
 	def makeCRCTable(self):&lt;br /&gt;
 		self.crcTable = [0L]*256&lt;br /&gt;
 &lt;br /&gt;
 		for i in range(256):&lt;br /&gt;
 			c = long(i)&lt;br /&gt;
 			for k in range(8):&lt;br /&gt;
 				if ( c &amp;amp;amp; 1 ) :&lt;br /&gt;
 					c = 0xedb88320L ^ (c&amp;amp;gt;&amp;amp;gt;1)&lt;br /&gt;
 				else :&lt;br /&gt;
 					c = c &amp;amp;gt;&amp;amp;gt; 1&lt;br /&gt;
 			self.crcTable[i] = c&lt;br /&gt;
 &lt;br /&gt;
 	def updateCRC(self, buf):&lt;br /&gt;
 		c = 0xFFFFFFFFL&lt;br /&gt;
 &lt;br /&gt;
 		for ch in buf:&lt;br /&gt;
 			#c = crcTable[(c ^ ord(ch) ) &amp;amp;amp; 0xff] ^ (c &amp;amp;gt;&amp;amp;gt; 8)&lt;br /&gt;
 			c = self.crcTable[int ((c^ord(ch))&amp;amp;amp;0xff) ] ^ (c &amp;amp;gt;&amp;amp;gt; 8)&lt;br /&gt;
 		&lt;br /&gt;
 		return long(c)&lt;br /&gt;
 &lt;br /&gt;
 	def getCRC(self, buf):&lt;br /&gt;
 		return long(self.updateCRC(buf) ^ 0xFFFFFFFFL )&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 class RGB:&lt;br /&gt;
 	def __init__(self, r, g, b):&lt;br /&gt;
 		self.r = r&lt;br /&gt;
 		self.g = g&lt;br /&gt;
 		self.b = b&lt;br /&gt;
 &lt;br /&gt;
 	def compare(self, rgb):&lt;br /&gt;
 		return self.r == rgb[0] and self.g == rgb[1] and self.b == rgb[2]&lt;br /&gt;
 &lt;br /&gt;
 	def __eq__(self, rgb):&lt;br /&gt;
 		return self.compare(rgb)&lt;br /&gt;
 &lt;br /&gt;
 	def __str__(self):&lt;br /&gt;
 		return str((self.r, self.g, self.b))&lt;br /&gt;
----&lt;br /&gt;
[[PNGFileFormat]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>