write-ups-challenges-2019-2020/Waldo/main.py

75 lines
1.9 KiB
Python
Raw Permalink Normal View History

2022-11-24 21:43:03 +00:00
from PIL import Image
import bytes
TARGETIMAGE = 'Christmass.png'
FLAGIMAGE = 'WaldoFlag.png'
Target = Image.open(TARGETIMAGE)
Flag = Image.open(FLAGIMAGE)
newImg = Target.copy()
(TargetMaxX, TargetMaxY) = newImg.size
(FlagMaxX, FlagMaxY) = Flag.size
if ((TargetMaxX != FlagMaxX) or (TargetMaxX != FlagMaxX)):
raise Exception("This does not work with images of different sizes (yet)")
def Merge(OriginRGBA, TargetRGBA, numberOfBits=1):
OriginBytes = [bytes.int2byte(x) for x in OriginRGBA]
TargetBytes = [bytes.int2byte(x) for x in TargetRGBA]
newbytes = [0] * len(TargetBytes)
for i in range(len(OriginBytes)):
newbytes[i] = bytes.swapMSB2LSB(OriginBytes[i], TargetBytes[i], numberOfBits)
# print(OriginBytes, TargetBytes, newbytes)
return tuple([bytes.byte2int(b) for b in TargetBytes])
for y in range(FlagMaxY):
for x in range(FlagMaxX):
OriginRGBA = Flag.getpixel((x, y))
TargetRGBA = Target.getpixel((x, y))
newValues = Merge(OriginRGBA, TargetRGBA)
print('%s / %s X \t-\t %s / %s Y' % (x, FlagMaxX, y, FlagMaxY))
newImg.putpixel((x, y), newValues)
# Target.close()
# Flag.close()
print("saving")
newImg.save("Hidden.png")
print("done")
def extract(TargetRGBA, numberOfBits=1):
TargetBytes = [bytes.int2byte(x) for x in TargetRGBA]
newbytes = [0] * len(TargetBytes)
for i in range(len(TargetBytes)):
newbytes[i] = bytes.extractLSB(TargetBytes[i], numberOfBits)
# print(newbytes, end="\n")
return tuple([bytes.byte2int(b) for b in newbytes])
revert = newImg.copy()
for y in range(FlagMaxY):
for x in range(FlagMaxX):
print('%s / %s X \t-\t %s / %s' % (x, FlagMaxX, y, FlagMaxY))
# print([bytes.int2byte(x) for x in Flag.getpixel((x, y))], end="\t - \t")
revert.putpixel((x, y), extract(newImg.getpixel((x, y))))
# print("---\n")
revert.save("revert.png")