GIMP:Python脚本中如何获取选区内部的代表性采样点
在Python-Fu中获取模糊选区的代表性颜色值
一、优先获取用户触发模糊选择的点击像素颜色
模糊选择(如魔棒工具)由用户点击特定像素触发,GIMP会记录该点击坐标,可直接通过上下文API获取,再调用pdb.gimp_image_pick_color取色,这是最贴合需求的方案。
代码示例
# 获取当前活动图像与图层 image = pdb.gimp_image_get_active() drawable = pdb.gimp_image_get_active_drawable(image) # 获取用户最后一次点击的坐标(即模糊选择的触发点) click_x = pdb.gimp_context_get_last_x() click_y = pdb.gimp_context_get_last_y() # 校验坐标是否在图像范围内 img_width = pdb.gimp_image_get_width(image) img_height = pdb.gimp_image_get_height(image) if 0 <= click_x < img_width and 0 <= click_y < img_height: # 拾取单个像素颜色:参数依次为图像、图层、X、Y、是否采样周围、是否取平均、采样半径 success, r, g, b, a = pdb.gimp_image_pick_color(image, drawable, click_x, click_y, False, False, 0) if success: print(f"触发点颜色: R={r}, G={g}, B={b}, A={a}") else: print("无法拾取触发点颜色") else: print("触发点坐标超出图像范围")
二、无法获取点击点时,获取选区的代表性颜色
如果无法拿到用户点击坐标,可通过选区边界框计算中心像素,或直接计算选区平均颜色作为替代。
1. 取选区中心像素颜色
# 获取选区边界框 has_selection, x1, y1, x2, y2 = pdb.gimp_selection_bounds(image) if has_selection: # 计算选区中心坐标 center_x = (x1 + x2) // 2 center_y = (y1 + y2) // 2 # 拾取中心像素颜色 success, r, g, b, a = pdb.gimp_image_pick_color(image, drawable, center_x, center_y, False, False, 0) if success: print(f"选区中心颜色: R={r}, G={g}, B={b}, A={a}")
2. 计算选区平均颜色
通过创建临时可见图层提取选区内容,再利用直方图计算平均色值:
if has_selection: # 创建临时图层,仅包含选区可见内容 temp_layer = pdb.gimp_layer_new_from_visible(image, image, "temp-selection-layer") pdb.gimp_image_insert_layer(image, temp_layer, None, 0) # 获取RGB通道直方图,返回值为(像素总数, 最小值, 最大值, 平均值, 标准差) hist_r = pdb.gimp_drawable_histogram(temp_layer, HISTOGRAM_RED, 0, 255) hist_g = pdb.gimp_drawable_histogram(temp_layer, HISTOGRAM_GREEN, 0, 255) hist_b = pdb.gimp_drawable_histogram(temp_layer, HISTOGRAM_BLUE, 0, 255) avg_r, avg_g, avg_b = hist_r[3], hist_g[3], hist_b[3] print(f"选区平均颜色: R={avg_r:.2f}, G={avg_g:.2f}, B={avg_b:.2f}") # 清理临时图层 pdb.gimp_image_remove_layer(image, temp_layer)
内容的提问来源于stack exchange,提问作者Loma Harshana
相关产品推荐
相关产品推荐

