python调用PIL库处理图片
最近在做一个相册类的小项目,其中涉及到用户上传裁剪图片,除了图片形状上的要求,还有亮度、对比度、饱和度以及灰度。项目需求是前端上传是在微信小程序实现,后台用Java写的,最终要实现将上传的图片转成pdf打印出来,微信小程序使用的cropper插件,界面实现的很完美,实在前端标签中为原图设置各种样式和形状,到后台实现图片装pdf的时候,没有找到合适的插件程序实现图片和样式及形状的融合,各种百度,各种尝试之后,最终选择放弃用Java,改用python来完成图片和样式的融合,再通过Java转pdf,话不多说,直接上代码。
项目调用python程序的Java代码:
package com.sxzyq.common.utils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;public class PythonExecution {public static void main(String[] args) {args=new String[]{"python", "G:\\pythonWorkSpace\\imageProcess.py", "G:\\moni\\11.jpg", "G:\\moni\\157output.png", "2", "2", "2","false", "0.46", "200.5842", "200.21452525"};System.out.println(getPyResult(args));}public static String getPyResult(String[] args){String str = "";try {Process process = Runtime.getRuntime().exec(args);InputStream inputStream = process.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String line;StringBuilder output = new StringBuilder();while ((line = bufferedReader.readLine()) != null) {output.append(line);}str = output.toString();bufferedReader.close();} catch (IOException e) {e.printStackTrace();}return str;}
}
python调用PIL图像处理库的代码:
from PIL import Image, ImageEnhance, ImageDraw
import sysdef change_image_saturation(image_path, output_path, saturation_factor, contrast_factor, brightness_factor, apply_ellipse, grayscale_factor, new_size):try:# Open the imageimage = Image.open(image_path)image = image.resize(new_size)# Apply saturation, contrast, and brightness enhancementsimage = ImageEnhance.Color(image).enhance(saturation_factor)image = ImageEnhance.Contrast(image).enhance(contrast_factor)image = ImageEnhance.Brightness(image).enhance(brightness_factor)# Apply grayscale if grayscale_factor is specifiedif grayscale_factor > 0:enhancer = ImageEnhance.Color(image)image = enhancer.enhance(1 - grayscale_factor)# Apply elliptical mask if condition is Trueif apply_ellipse:# Create a mask with an elliptical shapemask = Image.new("L", image.size, 0)draw = ImageDraw.Draw(mask)draw.ellipse((0, 0, image.width, image.height), fill=255)# Apply the mask to the imageimage.putalpha(mask)# Create a transparent image to hold the final resultoutput_image = Image.new("RGBA", image.size, (0, 0, 0, 0))output_image.paste(image, (0, 0), mask)# Save the output image with transparencyoutput_image.save(output_path, 'PNG')else:# Save the enhanced image without any maskimage.save(output_path)except Exception as e:print(f"An error occurred: {e}")if __name__ == "__main__":# Read command-line argumentsimage_path = sys.argv[1]output_path = sys.argv[2]saturation_factor = float(sys.argv[3])contrast_factor = float(sys.argv[4])brightness_factor = float(sys.argv[5])apply_ellipse = sys.argv[6].lower() == 'true'grayscale_factor = float(sys.argv[7])new_size = (int(round(float(sys.argv[8]))),int(round(float(sys.argv[9]))))# Call the functionchange_image_saturation(image_path, output_path, saturation_factor, contrast_factor, brightness_factor, apply_ellipse, grayscale_factor, new_size)
亲测用户体验度不错,有相似需求的可以拿着用用。有不明白的可以评论区回复,我会及时回复,咱们一起探讨一起进步。