删除无用图片,增加双线性插值法
This commit is contained in:
parent
3b1b3b7ef1
commit
ad3274826b
BIN
imgs/1/1x3.bmp
BIN
imgs/1/1x3.bmp
Binary file not shown.
Before Width: | Height: | Size: 66 B |
BIN
imgs/1/2x1.bmp
BIN
imgs/1/2x1.bmp
Binary file not shown.
Before Width: | Height: | Size: 70 B |
BIN
imgs/1/2x3.bmp
BIN
imgs/1/2x3.bmp
Binary file not shown.
Before Width: | Height: | Size: 70 B |
BIN
imgs/16.bmp
BIN
imgs/16.bmp
Binary file not shown.
Before Width: | Height: | Size: 122 B |
Binary file not shown.
After Width: | Height: | Size: 290 KiB |
BIN
imgs/256.bmp
BIN
imgs/256.bmp
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
118
main.py
118
main.py
|
@ -1,21 +1,24 @@
|
||||||
from math import floor
|
from math import floor, ceil
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
|
||||||
################## 数据输入 Start ##################
|
################## 数据输入 Start ##################
|
||||||
|
|
||||||
# 输入数据
|
# 输入数据
|
||||||
|
|
||||||
# img = input("请输入图片路径:")
|
# img = input("请输入图片路径:")
|
||||||
# new_width = int(input("请输入新宽度(px):"))
|
# new_width = int(input("请输入新宽度(px):"))
|
||||||
# new_height = int(input("请输入新高度(px):"))
|
# new_height = int(input("请输入新高度(px):"))
|
||||||
# print("模式 0 直接缩放")
|
# print("模式 0 双线性插值")
|
||||||
# print("模式 1 高斯模糊缩放")
|
# print("模式 1 最邻近插值")
|
||||||
|
# print("模式 2 高斯模糊缩放")
|
||||||
# mode = int(input("请输入模式:"))
|
# mode = int(input("请输入模式:"))
|
||||||
img = 'imgs/1/2x1.bmp'
|
|
||||||
new_width = 512
|
|
||||||
new_height = 512
|
|
||||||
mode = 0
|
|
||||||
|
|
||||||
if (mode != 1):
|
img = 'imgs/xjtu.bmp'
|
||||||
|
new_width = 256
|
||||||
|
new_height = 256
|
||||||
|
mode = 1
|
||||||
|
|
||||||
|
if (mode not in [0, 1, 2]):
|
||||||
mode = 0
|
mode = 0
|
||||||
|
|
||||||
################## 数据输入 End ##################
|
################## 数据输入 End ##################
|
||||||
|
@ -86,7 +89,7 @@ while (i < len(colorsBoard)):
|
||||||
})
|
})
|
||||||
i += 4
|
i += 4
|
||||||
|
|
||||||
if (not (bpp in [1, 2, 4, 8, 16, 24, 32])):
|
if (not (bpp in [24, 32])):
|
||||||
print("不支持该图片")
|
print("不支持该图片")
|
||||||
exit()
|
exit()
|
||||||
################## 文件头处理 End ##################
|
################## 文件头处理 End ##################
|
||||||
|
@ -102,10 +105,22 @@ rowLength = floor(width * bpp / 8)
|
||||||
while (rowLength % 4 != 0 or rowLength == 0):
|
while (rowLength % 4 != 0 or rowLength == 0):
|
||||||
rowLength += 1
|
rowLength += 1
|
||||||
|
|
||||||
|
# colorsIndex = []
|
||||||
|
# if (bpp == 1):
|
||||||
|
# initPixel = imgBytes[dataStart] // 128
|
||||||
|
# colorsIndex.append()
|
||||||
|
|
||||||
# 计算像素点
|
# 计算像素点
|
||||||
i = dataStart
|
i = dataStart
|
||||||
for currentRow in tqdm(range(height), "读入像素点中"):
|
for currentRow in tqdm(range(height), "读入像素点中"):
|
||||||
currentCol = 0
|
currentCol = 0
|
||||||
|
# if (bpp in [1, 2, 4, 8]):
|
||||||
|
# # 其实可以直接存入索引,之后再取出,但是为了易于理解,这里直接将像素数据插入 pixels 数组,这会导致效率的损失
|
||||||
|
# b = 0
|
||||||
|
# # while(b < width*bpp):
|
||||||
|
# # if(bpp==1):
|
||||||
|
# # print("")
|
||||||
|
# else:
|
||||||
while (currentCol < width * (bpp // 8)):
|
while (currentCol < width * (bpp // 8)):
|
||||||
if (bpp == 32):
|
if (bpp == 32):
|
||||||
pixels[currentRow].append({
|
pixels[currentRow].append({
|
||||||
|
@ -126,7 +141,9 @@ for currentRow in tqdm(range(height), "读入像素点中"):
|
||||||
'g':
|
'g':
|
||||||
imgBytes[dataStart + currentRow * rowLength + currentCol + 1],
|
imgBytes[dataStart + currentRow * rowLength + currentCol + 1],
|
||||||
'b':
|
'b':
|
||||||
imgBytes[dataStart + currentRow * rowLength + currentCol + 2]
|
imgBytes[dataStart + currentRow * rowLength + currentCol + 2],
|
||||||
|
'a':
|
||||||
|
0
|
||||||
})
|
})
|
||||||
currentCol += bpp // 8
|
currentCol += bpp // 8
|
||||||
# 读入图片为像素数组完成
|
# 读入图片为像素数组完成
|
||||||
|
@ -139,11 +156,65 @@ newpixels = []
|
||||||
for i in range(new_height):
|
for i in range(new_height):
|
||||||
newpixels.append([])
|
newpixels.append([])
|
||||||
|
|
||||||
|
|
||||||
|
# 辅助计算函数
|
||||||
|
def linear_single(x, x1, x2, f1, f2):
|
||||||
|
return floor(f1 * (x2 - x) / (x2 - x1) + f2 * (x - x1) / (x2 - x1))
|
||||||
|
|
||||||
|
|
||||||
|
# 双线性插值函数
|
||||||
|
# 参考 https://zh.wikipedia.org/wiki/%E5%8F%8C%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC
|
||||||
|
def linear_insert(row, col):
|
||||||
|
x = row / scale_h
|
||||||
|
y = col / scale_w
|
||||||
|
# 如果整数格点就直接返回
|
||||||
|
x1 = floor(x)
|
||||||
|
x2 = ceil(x)
|
||||||
|
y1 = floor(y)
|
||||||
|
y2 = ceil(y)
|
||||||
|
if (x2 >= height):
|
||||||
|
x2 = x1
|
||||||
|
if (y2 >= width):
|
||||||
|
y2 = y1
|
||||||
|
if (x1 == x2 and y1 == y2):
|
||||||
|
return pixels[x1][y1]
|
||||||
|
if (x1 == x2):
|
||||||
|
x = x1
|
||||||
|
r = linear_single(y, y1, y2, pixels[x][y1]['r'], pixels[x][y2]['r'])
|
||||||
|
g = linear_single(y, y1, y2, pixels[x][y1]['g'], pixels[x][y2]['g'])
|
||||||
|
b = linear_single(y, y1, y2, pixels[x][y1]['b'], pixels[x][y2]['b'])
|
||||||
|
a = linear_single(y, y1, y2, pixels[x][y1]['a'], pixels[x][y2]['a'])
|
||||||
|
return {'r': r, 'g': g, 'b': b, 'a': a}
|
||||||
|
if (y1 == y2):
|
||||||
|
y = y1
|
||||||
|
r = linear_single(x, x1, x2, pixels[x1][y]['r'], pixels[x2][y]['r'])
|
||||||
|
g = linear_single(x, x1, x2, pixels[x1][y]['g'], pixels[x2][y]['g'])
|
||||||
|
b = linear_single(x, x1, x2, pixels[x1][y]['b'], pixels[x2][y]['b'])
|
||||||
|
a = linear_single(x, x1, x2, pixels[x1][y]['a'], pixels[x2][y]['a'])
|
||||||
|
return {'r': r, 'g': g, 'b': b, 'a': a}
|
||||||
|
fy1_r = linear_single(x, x1, x2, pixels[x1][y1]['r'], pixels[x2][y1]['r'])
|
||||||
|
fy1_g = linear_single(x, x1, x2, pixels[x1][y1]['g'], pixels[x2][y1]['g'])
|
||||||
|
fy1_b = linear_single(x, x1, x2, pixels[x1][y1]['b'], pixels[x2][y1]['b'])
|
||||||
|
fy1_a = linear_single(x, x1, x2, pixels[x1][y1]['a'], pixels[x2][y1]['a'])
|
||||||
|
fy2_r = linear_single(x, x1, x2, pixels[x1][y2]['r'], pixels[x2][y2]['r'])
|
||||||
|
fy2_g = linear_single(x, x1, x2, pixels[x1][y2]['g'], pixels[x2][y2]['g'])
|
||||||
|
fy2_b = linear_single(x, x1, x2, pixels[x1][y2]['b'], pixels[x2][y2]['b'])
|
||||||
|
fy2_a = linear_single(x, x1, x2, pixels[x1][y2]['a'], pixels[x2][y2]['a'])
|
||||||
|
r = linear_single(y, y1, y2, fy1_r, fy2_r)
|
||||||
|
g = linear_single(y, y1, y2, fy1_g, fy2_g)
|
||||||
|
b = linear_single(y, y1, y2, fy1_b, fy2_b)
|
||||||
|
a = linear_single(y, y1, y2, fy1_a, fy2_a)
|
||||||
|
return {'r': r, 'g': g, 'b': b, 'a': a}
|
||||||
|
|
||||||
|
|
||||||
# 计算新像素
|
# 计算新像素
|
||||||
for currentRow in tqdm(range(new_height), "计算新像素点中"):
|
for currentRow in tqdm(range(new_height), "计算新像素点中"):
|
||||||
for currentCol in range(new_width):
|
for currentCol in range(new_width):
|
||||||
|
if (mode == 0):
|
||||||
|
newpixels[currentRow].append(linear_insert(currentRow, currentCol))
|
||||||
|
elif (mode == 1):
|
||||||
ori_row = floor(currentRow / scale_h)
|
ori_row = floor(currentRow / scale_h)
|
||||||
ori_col = floor(currentCol // scale_w)
|
ori_col = floor(currentCol / scale_w)
|
||||||
newpixels[currentRow].append(pixels[ori_row][ori_col])
|
newpixels[currentRow].append(pixels[ori_row][ori_col])
|
||||||
|
|
||||||
# 处理新文件
|
# 处理新文件
|
||||||
|
@ -185,8 +256,21 @@ newimgArray.extend(sizeByte(new_compression, 4))
|
||||||
new_imageSize = rowLength * new_height
|
new_imageSize = rowLength * new_height
|
||||||
newimgArray.extend(sizeByte(new_imageSize, 4))
|
newimgArray.extend(sizeByte(new_imageSize, 4))
|
||||||
|
|
||||||
# 调色板不做处理
|
new_wppm = wppm
|
||||||
newimgArray.extend(sizeByte(0, new_headerSize + 14 - len(newimgArray)))
|
newimgArray.extend(sizeByte(new_wppm, 4))
|
||||||
|
|
||||||
|
new_hppm = hppm
|
||||||
|
newimgArray.extend(sizeByte(new_hppm, 4))
|
||||||
|
|
||||||
|
new_colorsNum = colorsNum
|
||||||
|
newimgArray.extend(sizeByte(new_colorsNum, 4))
|
||||||
|
|
||||||
|
new_icolorsNum = icolorsNum
|
||||||
|
newimgArray.extend(sizeByte(new_icolorsNum, 4))
|
||||||
|
|
||||||
|
new_colorsBoard = colorsBoard
|
||||||
|
for color in new_colorsBoard:
|
||||||
|
newimgArray.append(color)
|
||||||
|
|
||||||
|
|
||||||
def flur(row, col):
|
def flur(row, col):
|
||||||
|
@ -244,7 +328,9 @@ def flur(row, col):
|
||||||
for i in tqdm(range(len(newpixels)), "将像素点格式化中"):
|
for i in tqdm(range(len(newpixels)), "将像素点格式化中"):
|
||||||
row = newpixels[i]
|
row = newpixels[i]
|
||||||
for col in range(len(row)):
|
for col in range(len(row)):
|
||||||
if (mode == 0):
|
if (mode == 2):
|
||||||
|
newimgArray.extend(flur(i, col))
|
||||||
|
else:
|
||||||
if (new_bpp // 8 == 3):
|
if (new_bpp // 8 == 3):
|
||||||
pixel = [
|
pixel = [
|
||||||
newpixels[i][col]['r'], newpixels[i][col]['g'],
|
newpixels[i][col]['r'], newpixels[i][col]['g'],
|
||||||
|
@ -256,14 +342,12 @@ for i in tqdm(range(len(newpixels)), "将像素点格式化中"):
|
||||||
newpixels[i][col]['b'], newpixels[i][col]['a']
|
newpixels[i][col]['b'], newpixels[i][col]['a']
|
||||||
]
|
]
|
||||||
newimgArray.extend(pixel)
|
newimgArray.extend(pixel)
|
||||||
elif (mode == 1):
|
|
||||||
newimgArray.extend(flur(i, col))
|
|
||||||
newimgArray.extend(sizeByte(0, rowLength - len(row) * (new_bpp // 8)))
|
newimgArray.extend(sizeByte(0, rowLength - len(row) * (new_bpp // 8)))
|
||||||
|
|
||||||
# 写入新的文件
|
# 写入新的文件
|
||||||
newimgBytes = bytes(newimgArray)
|
newimgBytes = bytes(newimgArray)
|
||||||
|
|
||||||
with open(img[:-4] + "_new" + img[-4:], 'wb') as f:
|
with open(img[:-4] + "_" + str(mode) +"_new" + img[-4:], 'wb') as f:
|
||||||
f.write(newimgBytes)
|
f.write(newimgBytes)
|
||||||
for _ in tqdm(range(len(newimgBytes)), "写出图片中"):
|
for _ in tqdm(range(len(newimgBytes)), "写出图片中"):
|
||||||
pass
|
pass
|
Loading…
Reference in New Issue