Что делает программа:
Я создаю программу, которая читает растровые изображения (24 бита)
Ищет 0xff или 0x0 в строке растрового изображения
заполняет матрицу, состоящую из нулей, с размером, равным размеру изображения
изменяет правильное значение матрицы на 1 для значения 0x0.
Затем он читает каждый двоичный столбец и создает строку
Строка преобразуется в шестнадцатеричное и сохраняется в документе.
Изображения являются просто черно-белыми изображениями.
Вопрос:
Проблема в том, что я заставил его работать с двумя разными тестовыми изображениями, которые у меня есть.
Один 8x8, и выходная сетка соответствует ожидаемой.
Другой - 17x15, и результат также является ожидаемым.
Я сделал несколько новых изображений, 11x8px, и они оказались совершенно неправильными. Где-то у меня слишком много символов в возвращенной строке растрового изображения.
Я читаю растровые изображения, игнорируя 54 первых символа, а затем удаляю любые нечетные символы, которые там добавляются. Все, что не является ни 0xff, ни 0x0, удаляется.
Тем не менее, для 11x8px у меня есть некоторые оставшиеся символы.
Проблемное изображение размером 11x8 пикселей с черными пикселями по краю и ничего больше.
Это должно быть всего 88 пикселей и в 24-битном формате должно содержать 264 записи в парах по 3 для значений BGR. После удаления 54 первых записей заголовка и удаления нечетных символов у меня 288 записей. 24 символа слишком много, и мой код не работает из-за этого ..
Примеры входных данных, загруженных в виде BMP и выходных сеток.
Вы можете видеть, что квадратная сетка не отображается правильно, в то время как другие отображают.
https://imgur.com/a/MJkbWl3
Строка квадратного файла BMP:
"BMV 6 ( ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ "
Есть идеи, что происходит? Где эти 24 неуместных символа и что они означают?
Код: BmpToCharset
import numpy as np
import readBmp as ri
#test strings
str1 = " ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"
str2 = "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿ ÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"
def bmpToChar(filename,width,height):
#Get string from filename
string = ri.readBmp(filename)
#Amount of HexValues per pixel
hexValues = int(len(string)/(width*height))
if len(string)%(width*height) != 0:
print("ERROR! Unicode string is wrong lenght.\n Lenght",len(string),"Expected multiples of",width*height,"but got",len(string)%(width*height),"unkown values")
print("------------------------------------------------------")
print("Unicode string lenght:",len(string),"\nImage width:",width,"\nImage height:",height,"\nValues per pixel: ",hexValues)
#x,y position to start at
x = 1
y = 1
#pixel counter
count = 1
#Create array with zeros:
grid = np.zeros((height,width))
print("grid:\n",grid)
#Loop through values of bitmap file
while y <=height:
while x <=width:
#Loop for each value in bitmap from 0 to the last hex value
for i in range(0,hexValues):
if hex(ord(string[count-1]))=="0xff":
color = "white"
else:
color = "black"
#Only show x value and skip the rest
if count%hexValues == 0:
print("Hex entry nr:",count,hex(ord(string[count-1])),"at x:",x,",","y:",y,":", "color:",color,": pixel nr:",int(count/hexValues))
#Set correct binary value
if color == "black":
binValue = 1
else:
binValue = 0
#Change value of grid:
grid[(height-1)-(y-1),(x-1)] = binValue
print("New grid:\n",grid)
#else:
#print("Hex entry nr:",count,"not divideble by", hexValues)
count +=1
x += 1
x = 1
y += 1
print("Ended loops at x:",x," y:",y)
#Print final matrix:
print("Final grid:\n",grid)
#Save grid in file
file = open('CharInHex.txt','w')
#File Syntax prefix
file.write("{{")
for j in range(0,width):
#Reset binString to be empty
binString = ""
#Take current column and save it as binColumn
binColumn = grid[:,j]
print("\nbinColumn:",j+1,"\n",binColumn)
#For each binary entry in the binColumn save the entry to binString
for k in range(0,height):
#from bottom up height-1-k. From top just k
binString += str(int(binColumn[height-1-k]))
print("binString of column:",binString)
#Save as a hexa value
hexColumn = hex(int(binString,2))
print("hex(binString):",hexColumn)
#Save in file
file.write(hexColumn)
if j != (width-1):
file.write(",")
#File Syntax suffix
file.write("}}")
file.close()
#read file
fr = open('CharInHex.txt','r')
text = fr.read()
print("\n Saved document reads: \n",text)
fr.close()
Чтение файла и возврат строки, используемой вышеуказанной программой:
#Reads Bitmap from filename and returns the string - first 54 chars.
def readBmp(filename):
#Read file
fr = open(filename+'.bmp','r')
bmpRaw = fr.read()
#Empty Header
fileInfo = ""
#Empty Pixel BGR string
string = ""
bmpRawLen = len(bmpRaw)
oddSymbols = 0
for i in range(0,54):
fileInfo += bmpRaw[i]
print("bitmap raw string:",bmpRaw,"\nRaw string
lenght",bmpRawLen,"\nFile info:",fileInfo)
print("-----------------------------------------------------------------
----------------")
print("Displaying header info:")
for j in range(0,54):
temp = hex(ord(fileInfo[j]))
intVal = int(ord(fileInfo[j]))
print("Entry:",j+1,"symbol:","'"+fileInfo[j]+"'","hex:",temp,"numeric value:",intVal)
#Create file without header:
print("\nRemoving header")
for k in range(54,bmpRawLen):
#Show each added symbol COMMENT OUT
print("Entry:",k+1,"symbol:","'"+bmpRaw[k]+"'","hex:",hex(ord(bmpRaw[k])),"int:",int(ord(bmpRaw[k])))
if (int(ord(bmpRaw[k])) == 255):
string += bmpRaw[k]
elif (int(ord(bmpRaw[k])) == 0):
string += bmpRaw[k]
else:
print("found odd symbol:","'"+bmpRaw[k]+"'","at entry:",k,"which was
not added to string")
oddSymbols += 1
print("Done. Removed header and",oddSymbols," odd symbols from rawBmp")
print("\nString without header:\n",string,"\nLenght of string:",len(string))
fr.close()
return string