这里用24位位图的bmp格式演示,下图是一个8*6的图片,对其扩大三倍
一个图像可以转化为一个三维数组,例如一个2*2 24位位图的bmp格式图像可以转成
[[[ 1 1 1]
[ 1 1 1]]
[[ 1 1 1]
[30 89 77]]]
所以,我们可以用数组的方式进行图像扩充
首先,导入numpy库
import numpy as np #引入库
import matplotlib.image as img
from PIL import Image
输入对应的值
long=int(input('导入的图像长度:'))
wide=int(input('导入的图像宽度:'))
inname=input("please enter the picture path:")
end_l=long*num
end_w=wide*num
im = img.imread(inname) # 图像读取
然后生成一个扩大后的图像数组,这里我们生成为1的数组(这里任意数字都可以,这里为了方便演示),接下来就是读取原图每一个像素的数据,用x和y作为计数器,用于定位在新数组的位置。我们把原图中的每一个像素的数据一次放到对应位置,就可以生成下图。
new=np.full((end_w, end_l, 3), 1)#生成一个扩大后的图像的数组
y=num-1
x=-1
for i in range(0, wide):
x=x+num
for i1 in range(0,long): #读取每一位像素
new[x][y]=im[i][i1]
y = y + num
if y>end_l: #图像超出范围,还原变量y
y=num-1
new=add(num)
接下来就是要填充对应的正方形,因为我们对应位置是正方形的右下角,所以要把剩余的位置填充一样的颜色。这里用for循环来完成,前两行的row和line的循环可以定位读写出上图中彩色块的位置,i1和i2会依次经过正方形的每一个像素点,然后全部填充为右下角的颜色。
def add(num): #复制右下角的像素,填充整个正方形
for row in range(num-1, end_w, num):
for line in range(num-1, end_l, num):
for i1 in range(0,num):
for i2 in range(0, num):
new[row-i1][line-i2] = new[row][line]
return new
这样子,就可以生成一个扩大的图像,然后就可以保存图像
new = Image.fromarray(np.uint8(new)) ##将array转成PIL image
new.save("outname.bmp") # 生成图片+保存图片
jpg格式也可以,原图片和输出的图片最好是相同格式,不同格式也可以,但是图像会有锯齿