2018-03-25 18:55:30 +00:00
# TODO add feature to include original filename in file, use filename to reconstruct original file without user input
# TODO make this work in RGB colorspace, reduce number of pixels needed
# we need to encode ASCII data as an image!
# each ASCII character takes up a 0-127 space, meaning we can fit at least 1 ASCII character into each channel of a given pixel in an image!
# we need to assign the numeric value of a series of ASCII characters to each of the channels of each pixel of an image!
2018-10-28 01:54:46 +00:00
# ensure proper division
from __future__ import division
import os
2018-03-25 18:55:30 +00:00
# make list from string
fileName = raw_input ( " Give me a file to pixelize: \n " )
#fileName = ""
data = open ( fileName , " r " )
dataString = data . read ( )
#dataString = raw_input("Please give me text:")
dataList = list ( dataString )
listLength = len ( dataList )
#print "list length: " + str(listLength)
import math
width = int ( math . ceil ( math . sqrt ( listLength / 3 ) ) )
2018-10-28 01:54:46 +00:00
#width = int(math.ceil(listLength/3))+1
2018-03-25 18:55:30 +00:00
#print "width: " + str(width)
# make the image
from PIL import Image
image = Image . new ( ' RGB ' , ( width , width ) , color = 0 )
2018-10-28 01:54:46 +00:00
#image = Image.new('RGB',(width,1),color=0)
2018-03-25 18:55:30 +00:00
# load the temp image and store the ASCII value in one of its pixels
px = image . load ( )
# px[1,1] = (ascValue)
#image.show()
# we have to loop through the coordinates 1,1 2,1 3,1 1,2 2,2 3,2 with 3 being the width of the image - maybe we raise the x coordinate until it hits the width count, then raise the y coordinate until it hits the secnd width count, then do the same operation - can we use modulo to determine if a scanline width count has been reached?
# then we need to assign the ASCII numeric value to the pixel at each of those locations
index = 0
for q in range ( 0 , width ) :
for i in range ( 0 , width ) :
if index < listLength : #prevents an error when trying to access data at indices higher than what's in the list
# evaluate RGB values
rVal = ord ( dataList [ index ] )
if ( index + 1 ) < listLength :
gVal = ord ( dataList [ index + 1 ] )
else :
gVal = 0
if ( index + 2 ) < listLength :
bVal = ord ( dataList [ index + 2 ] )
else :
bVal = 0
px [ i , q ] = ( rVal , gVal , bVal )
#print rVal
#print gVal
#print bVal
2018-10-28 01:54:46 +00:00
#print str(index+1) + "/" + str(listLength) + " done"
currentProgress = 100 * ( ( index + 1 ) / listLength )
print ( " {:.4f} % " . format ( currentProgress ) )
2018-03-25 18:55:30 +00:00
index + = 3
2018-10-28 01:54:46 +00:00
print ( " Finished! " )
#image.show()
image . save ( " CONVERTED.png " )
oldFileSize = os . path . getsize ( fileName )
newFileSize = os . path . getsize ( " CONVERTED.png " )
fileSizeReduction = 100 * ( 1 - ( newFileSize / oldFileSize ) )
2018-03-25 18:55:30 +00:00
2018-10-28 01:54:46 +00:00
print ( " File size reduced by {:.2f} % " . format ( fileSizeReduction ) )