背景需求:
打印了袜子配对的PDF模版,做预测试
【教学类-74-02】彩色袜子配对02--左右配对-CSDN博客文章浏览阅读497次,点赞10次,收藏9次。【教学类-74-02】彩色袜子配对02--左右配对https://blog.csdn.net/reasonsummer/article/details/141139239
【教学类-74-03】彩色袜子配对03--影子配对-CSDN博客文章浏览阅读651次,点赞30次,收藏9次。【教学类-74-03】彩色袜子配对03--影子配对https://blog.csdn.net/reasonsummer/article/details/141140265【教学类-74-04】黑白袜子组装04--圣诞袜子-CSDN博客
【教学类-74-04】黑白袜子组装04--圣诞袜子-CSDN博客文章浏览阅读889次,点赞24次,收藏8次。【教学类-74-04】黑白袜子组装04--圣诞袜子https://blog.csdn.net/reasonsummer/article/details/141190398
三款学具都打印了一张,测试我有一种感觉——好浪费
1、图案周围有大量的空白位置,裁剪后一半的白纸扔掉了
2、图片图案比较小,比如圣诞袜子,无法在里面塞东西
3、所以我希望袜子图案能够最大化,同时将两只袜子能够拼图(需要变成透明PNG)
从20240815-20240817我用星火讯飞、UIBOT和Photoshop反复测试,终于梳理出一套吧星火讯飞图案最大化(去掉白边)、制作PNG透明图片的流程。
主要流程:
1、通义万相生成图片
2、UIBOT下载图片
3、手工分类图片,放到文件夹
4、UIBOT+PS对图片进行背景填色(选取相似白色填充255,255,255)
5、PS手工修图:多余元素去除
6、Python切掉图片的白边(识别上下左右的第一个非白色坐标,切掉相应点垂线的块面)
7、切边不准确的图片手动修图,继续Python切掉白边
8、将图片白色部分变成透明色
9、再次统一图片的长宽
具体操作如下
一、通义万相生成图片
二、UIBOT下载图片
三、挑选分类图片
(一)不符合需求的照片
(二)需要的照片
三、复制文件夹,使用UBIOT和PS背景修图
图片背景修改成白色
四、手动修图,去掉不要的元素。
根据自己的需求,适当手动修图
最后是白背景修图的饮料图片(只有杯子,杯子外面的装饰、黑点删除)
五、第一次切边:切掉图案四周的白边,确保黑色图案最大
'''
起吊白色背景255,255,255图片中黑色图案周围的一圈白边,确保图案最大化
星火讯飞、阿夏
20240817
'''
print('----1、切掉上下左右的白色图层------')
import os
from PIL import Image
import os,time
import shutil
from docx import Document
from docx.shared import Cm
from PIL import Image
from PyPDF2 import PdfFileMerger, PdfFileReader
from PIL import Image, ImageDraw, ImageFont
import os,random
path=r'C:\Users\jg2yXRZ\OneDrive\图片\20240817饮料汉堡'
# 留一点白边
white_edge=10
import os
from PIL import Image
def find_non_white_pixel(image):
width, height = image.size
left, right, top, bottom = width, 0, height, 0
for y in range(height):
for x in range(width):
r, g, b = image.getpixel((x, y))
if r != 255 or g != 255 or b != 255:
if x < left:
left = x
if x > right:
right = x
if y < top:
top = y
if y > bottom:
bottom = y
return left, right, top, bottom
def crop_image(image, left, right, top, bottom):
return image.crop((left-white_edge, top-white_edge, right + white_edge, bottom + white_edge))
folder_path = path+r'\饮料白色'
output_folder = path+r'\饮料切边图'
os.makedirs(output_folder, exist_ok=True)
for file_name in os.listdir(folder_path):
if file_name.endswith(".jpg") or file_name.endswith(".png"):
input_path = os.path.join(folder_path, file_name)
image = Image.open(input_path)
left, right, top, bottom = find_non_white_pixel(image)
cropped_image = crop_image(image, left, right, top, bottom)
output_path = os.path.join(output_folder, file_name)
cropped_image.save(output_path)
切边前后对比
1、切边之前的图案都是1024*1024,周围有白色图案
切边之后,上下左右的白边切掉了,主体图案变大了,但图案长宽尺寸完全不同
检查切边图,是否有图片白边没有完全切除
说明这些图片的白色部分有看不见的黑色,需要再次手动清除。
记住编号,退出切边图文件夹,回到白色图片文件夹,选取图片手动修图
第一次切边后,需要检查切边位置知否正好贴合黑色图案四条边
我发现背景里看不见的黑色还不少,影响切边位置的准确性,
所以还是要手动把每张图片除了图案部分以外的地方,打码成白色(主要是手动去冰块、背景水滴图片时,没有把黑色去干净)
肉眼看不出差别,只有PS里面才能,手动为白色背景填充(画笔工具图色)
再次用代码生成,图案最大化了
效果展示
对比图1(原始白色、周围白边)
对比图2(去边白色、最大化图案)
八、制作透明png
为了减少白色部分的浪费,将白色部分变成透明色,让图案与图案之间可以重合
'''
去边后白色地方变成透明色
星火讯飞、阿夏
20240817
'''
from PIL import Image
import os
def process_image(file_path):
img = Image.open(file_path)
img = img.convert("RGBA")
datas = img.getdata()
new_data = []
for item in datas:
if item[0] == 255 and item[1] == 255 and item[2] == 255:
new_data.append((255, 255, 255, 0))
else:
new_data.append(item)
img.putdata(new_data)
return img
path=r'C:\Users\jg2yXRZ\OneDrive\图片\20240817饮料汉堡'
input_folder = path+r'\饮料切边图'
output_folder = path+r'\饮料切边图透明'
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for file_name in os.listdir(input_folder):
if file_name.endswith(".png") or file_name.endswith(".jpg") or file_name.endswith(".jpeg"):
input_file_path = os.path.join(input_folder, file_name)
output_file_path = os.path.join(output_folder, file_name)
processed_image = process_image(input_file_path)
processed_image.save(output_file_path)
以下就是白色变透明的去边后的最大化图案
特别说明
在照片库里,白色背景png和透明背景png看上去都是白色,如何区分是否已经做成透明png?
透明png偶尔有几张是黑底的,说明是png透明图层,但是大部分还是看上去是白色底
需要双击打开图片,浏览.
1、如果图案有明显的白色背景,与浅灰色查看器背景不同,说明就是白色png
2、如果图案没有白色背景,与浅灰色查看器背景融为一体,说明就是透明png
做成透明png,可以实现拼图
同样如果使用白色背景,就无法拼图
白色背景会浪费纸张,图案本身变小
九、统一图片尺寸
用这种方法,可以获取透明PNG图片,但是修改透明和切边的图片尺寸是不同的。
所以需要用Python程序调整统一这些图片的长宽
'''
去边后白色地方变成透明色,透明图片统一大小
星火讯飞、阿夏
20240817
'''
print('----2、图片放大成为1024*1024------')
import os
from PIL import Image
path=r'C:\Users\jg2yXRZ\OneDrive\图片\20240817饮料汉堡'
input_folder = path+r'\饮料切边图'
output_folder = path+r'\饮料切边图透明'
# 提取最大宽度的那张图片的尺寸
def get_max_width_and_height(fold_path):
max_width = 0
max_height = 0
for file_name in os.listdir(fold_path):
if file_name.endswith(".png") or file_name.endswith(".jpg") or file_name.endswith(".jpeg"):
file_path = os.path.join(fold_path, file_name)
img = Image.open(file_path)
width, height = img.size
if width > max_width:
max_width = width
max_height = height
return max_width, max_height
fold_path = output_folder
max_width, max_height = get_max_width_and_height(fold_path)
print("最大宽度:", max_width)
print("最大高度:", max_height)
# 最大宽度: 724
# 最大高度: 869
# # 自定义长宽
# max_width=622
# max_height=877
# 统一所有图片大小
def resize_image(image_path, output_folder, new_image_name):
img = Image.open(image_path)
new_img = img.resize((max_width,max_height))
new_img.save(os.path.join(output_folder, new_image_name))
newput_folder =path+r'\饮料一大小图'
os.makedirs(newput_folder,exist_ok=True)
for file in os.listdir(output_folder):
if file.endswith('.png'):
input_image_path = os.path.join(output_folder, file)
new_image_name = f"{file[:-4]}.png"
resize_image(input_image_path, newput_folder, new_image_name)