You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python去除图片间隔透明区域并拼接不透明内容?

用Python去除图片中的透明间隔区域

原始图片存在不透明区域与透明区域交替的结构(1-透明间隔-2-透明间隔-3-透明间隔-4),目标是将这些不透明区域拼接为连续内容(1-2-3-4),去除中间的透明间隔。

原代码问题分析

你提供的代码仅能裁剪掉图片四周的透明区域,无法处理中间的透明间隔。原因是代码取了所有非空行/列的最大、最小索引,相当于把整个图片的有效区域框选出来,中间的透明部分依然会被保留。

解决方案

我们需要识别出所有包含不透明内容的列(从示例图看透明间隔是横向的,所以按列处理),只保留这些列,从而去掉中间的透明间隔。具体步骤如下:

  • 提取图片的alpha通道,判断每一列是否存在不透明像素
  • 筛选出所有非透明列,将这些列的像素数据拼接起来
  • 将处理后的像素数组转换回PIL图片并保存

修正后的代码

from PIL import Image
import numpy as np

def remove_transparent_gaps(image):
    # 将图片转为numpy数组
    im_array = np.array(image)
    # 获取alpha通道
    alpha_channel = im_array[:, :, 3]
    
    # 找出所有包含不透明像素的列(列的alpha最大值>0)
    non_transparent_cols = np.where(alpha_channel.max(axis=0) > 0)[0]
    
    # 只保留这些非透明列
    trimmed_array = im_array[:, non_transparent_cols, :]
    
    # 转换回PIL图片
    return Image.fromarray(trimmed_array)

# 处理图片
image = Image.open("original_image.png")
new_image = remove_transparent_gaps(image)
new_image.save("new_image.png")

代码说明

  • 修正了原代码中的拼写错误:typfrom改为from
  • alpha_channel.max(axis=0):计算每一列的alpha通道最大值,大于0代表该列存在不透明像素
  • non_transparent_cols:筛选出所有非透明列的索引
  • trimmed_array = im_array[:, non_transparent_cols, :]:提取所有非透明列的像素数据,直接去掉透明间隔列

内容的提问来源于stack exchange,提问作者tomok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:12:35