Changes + some indication of timing for a non-representative image * Base version 2:52 (1024x1024, with 80% or so lot of transparent pixels) * Print only the row number 2:31 * Do not perform superfluous checks 2:32 (also drops math.sqrt) * Factor subtraction out 1:41 * Iterate over the palette directly 1:17 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ diff --git a/convertor_v4.py b/convertor_v4.py --- a/convertor_v4.py +++ b/convertor_v4.py @@ -48,11 +48,12 @@ def rgb2palette(inputImage, frameNumber) for y in range (0, i.height): + print("row {}".format(y)) for x in range (0, i.width): winnerDistance = 100000000 winnerID = 0 - pixelNumber = x + (y * i.width) + #pixelNumber = x + (y * i.width) pix = i.getpixel((x,y)) pixRed = pix[0] pixGreen = pix[1] @@ -63,49 +64,45 @@ def rgb2palette(inputImage, frameNumber) if pixAlpha < 128: finalAlpha = 0 colorOffset = 0 - if pixAlpha >= 128 and pixAlpha < 178: + elif pixAlpha < 178: finalAlpha = 255 colorOffset = 1 - if pixAlpha >= 178 and pixAlpha < 230: + elif pixAlpha < 230: finalAlpha = 255 colorOffset = 2 - if pixAlpha >= 230: + else: finalAlpha = 255 colorOffset = 0 if pixAlpha >= 128: - for z in range(0, 255): - colorArray = p[z] + for z, (cr, cg, cb) in enumerate(p): #print("current z is ..." + str(colorArray) ) - paletteR = colorArray[0] - paletteG = colorArray[1] - paletteB = colorArray[2] - distance = math.sqrt( ((pixRed-paletteR)*(pixRed-paletteR)) + ((pixGreen-paletteG)*(pixGreen-paletteG)) + ((pixBlue-paletteB)*(pixBlue-paletteB) )) + dr = pixRed - cr + dg = pixGreen - cg + db = pixBlue - cb + distance = dr*dr + dg*dg + db*db #print("Pixel " + str(pixelNumber) + ": " + str(distance) + " ,Alpha: " + str(pixAlpha) ) #taking the distance and comparing it to previous "round" - temporaryDistance = distance - temporaryID = z - #print("temporaryID is ..." + str(temporaryID) ) - if temporaryDistance < winnerDistance: - winnerDistance = temporaryDistance - winnerID = temporaryID + if distance < winnerDistance: + winnerDistance = distance + winnerID = z #print("new winner is ..." + str(winnerID) + "!!!") #colorOffset changes based on Value of the input if pixRed >= pixGreen and pixRed >= pixBlue: highestValue = pixRed - if pixGreen >= pixRed and pixGreen >= pixBlue: + elif pixGreen >= pixRed and pixGreen >= pixBlue: highestValue = pixGreen - if pixBlue >= pixRed and pixBlue >= pixGreen: + else: highestValue = pixBlue if highestValue < 128: negation = -1 colorOffset = colorOffset * negation - print("colorOffset is ... " + str(colorOffset) ) + #print("colorOffset is ... " + str(colorOffset) ) finalColor = p[winnerID - colorOffset] finalR = finalColor[0] @@ -114,7 +111,7 @@ def rgb2palette(inputImage, frameNumber) #finalAlpha taken from the if output above imageOutput.putpixel((x,y),(finalR,finalG,finalB,finalAlpha)) - print("Pixel " + str(pixelNumber) + ": R= " + str(finalR) + ", G= " + str(finalG) + ", B= " + str(finalB) + ", A= " + str(finalAlpha) ) + #print("Pixel " + str(pixelNumber) + ": R= " + str(finalR) + ", G= " + str(finalG) + ", B= " + str(finalB) + ", A= " + str(finalAlpha) )