最近偶然接触到一个需求,打印机打印结果不清晰。需要打印之前做一下处理。
第一个想法是DPI 不够?
第二个想法是不要直接打印,转成PDF 后投喂打印?
第三个想法是先做打印前的增强处理。
总之就是输入到打印机的图片还是别jpge格式了吧,no 压缩,用tif或者pdf 挺好的。然后需要做一下打印前的增强工作。
下面有两段源码,测试了一下,有一个明显的效果。具体如下:
(1)输入输出都是jpg(我是觉得给打印机就不要这个格式了,但是有时候不得已)
import cv2
import numpy as np
from PIL import Image
def upscale_image(img, target_dpi=300, original_dpi=96):
# 基于 DPI 比例进行图像放大
scale = target_dpi / original_dpi
new_size = (int(img.shape[1] * scale), int(img.shape[0] * scale))
return cv2.resize(img, new_size, interpolation=cv2.INTER_CUBIC)
def enhance_saturation(img, factor=1.2):
# HSV 模式增强饱和度
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype(np.float32)
h, s, v = cv2.split(hsv)
s *= factor
s = np.clip(s, 0, 255)
enhanced = cv2.merge([h, s, v])
return cv2.cvtColor(enhanced.astype(np.uint8), cv2.COLOR_HSV2BGR)
def apply_clahe(img):
# LAB空间增强亮度细节(自适应直方图均衡)
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
l2 = clahe.apply(l)
lab_enhanced = cv2.merge((l2, a, b))
return cv2.cvtColor(lab_enhanced, cv2.COLOR_LAB2BGR)
def unsharp_mask(img, sigma=1.0, strength=1.5):
# 高斯模糊 + 反差增强
blurred = cv2.GaussianBlur(img, (0, 0), sigma)
sharpened = cv2.addWeighted(img, 1 + strength, blurred, -strength, 0)
return sharpened
def rgb_to_cmyk_pil(img_path, save_path='cmyk_preview.jpg'):
# 使用 PIL 模拟转换为 CMYK 并保存
rgb = Image.open(img_path).convert('RGB')
cmyk = rgb.convert('CMYK')
cmyk.save(save_path)
print(f"CMYK模拟图已保存为: {save_path}")
def process_image_for_printing(input_path, output_path='output_print_ready.jpg'):
img = cv2.imread(input_path)
print("[INFO] 原始图像尺寸:", img.shape)
# 1. 放大到适合打印的分辨率
img = upscale_image(img, target_dpi=300)
print("[INFO] 已进行分辨率放大")
# 2. 增强饱和度
img = enhance_saturation(img, factor=1.2)
print("[INFO] 已增强色彩饱和度")
# 3. CLAHE 亮度细节增强
img = apply_clahe(img)
print("[INFO] 已增强亮度细节 (CLAHE)")
# 4. 锐化图像
img = unsharp_mask(img, sigma=1.0, strength=1.2)
print("[INFO] 已进行图像锐化 (Unsharp Mask)")
# 5. 保存增强后的图像(BGR 转 RGB)
cv2.imwrite(output_path, img)
print(f"[INFO] 处理完成,输出文件保存为:{output_path}")
# 6. 可选:CMYK 模拟转换
rgb_to_cmyk_pil(output_path, save_path='cmyk_preview.jpg')
# 运行示例
if __name__ == '__main__':
input_image_path = 'test_print.jpg' # ← 替换为你的图像路径
process_image_for_printing(input_image_path)
(2)输入png,输出是tif或者PDF
import cv2
import numpy as np
from PIL import Image
def enhance_image(img_bgr):
"""执行图像增强操作"""
# 放大图像(2x 分辨率)
img_bgr = cv2.resize(img_bgr, (img_bgr.shape[1]*2, img_bgr.shape[0]*2), interpolation=cv2.INTER_CUBIC)
# 饱和度增强(BGR → HSV)
hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV).astype(np.float32)
h, s, v = cv2.split(hsv)
s = np.clip(s * 1.3, 0, 255)
hsv = cv2.merge([h, s, v])
img_bgr = cv2.cvtColor(hsv.astype(np.uint8), cv2.COLOR_HSV2BGR)
# 亮度增强(CLAHE + LAB)
lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.5, tileGridSize=(8, 8))
l = clahe.apply(l)
lab = cv2.merge([l, a, b])
img_bgr = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)
# 锐化(Unsharp Mask)
blurred = cv2.GaussianBlur(img_bgr, (0, 0), sigmaX=1.2)
sharpened = cv2.addWeighted(img_bgr, 1.5, blurred, -0.5, 0)
return sharpened
def save_as_tiff_cmyk(rgb_image, output_path):
"""RGB 转为 CMYK 并保存为 TIFF"""
pil_rgb = Image.fromarray(rgb_image)
pil_cmyk = pil_rgb.convert('CMYK')
pil_cmyk.save(output_path, format='TIFF', compression='tiff_lzw')
print(f" 已保存为高质量 CMYK TIFF 文件: {output_path}")
def save_as_pdf(rgb_image, output_path):
"""保存为 RGB PDF(用于图文打印)"""
pil_rgb = Image.fromarray(rgb_image)
pil_rgb.save(output_path, format='PDF', resolution=300.0)
print(f"已保存为高质量 PDF 文件: {output_path}")
def process_png_for_print(input_png, output_tiff='output_print_ready.tif', output_pdf='output_print_ready.pdf'):
"""主流程:从 PNG → 增强 → 输出 TIFF & PDF"""
# 读取 PNG 图像(BGR 格式)
img_bgr = cv2.imread(input_png, cv2.IMREAD_COLOR)
if img_bgr is None:
raise FileNotFoundError(f"无法读取图像:{input_png}")
print(f"读取图像尺寸: {img_bgr.shape[1]}x{img_bgr.shape[0]}")
# 图像增强
enhanced_bgr = enhance_image(img_bgr)
# BGR → RGB
enhanced_rgb = cv2.cvtColor(enhanced_bgr, cv2.COLOR_BGR2RGB)
# 保存为 TIFF (CMYK)
save_as_tiff_cmyk(enhanced_rgb, output_tiff)
# 保存为 PDF (RGB)
save_as_pdf(enhanced_rgb, output_pdf)
# 示例调用
if __name__ == '__main__':
process_png_for_print("test_png.png",
output_tiff="final_for_print.tif",
output_pdf="final_for_print.pdf")