下载地址:https://www.pan38.com/share.php?code=pvvmX 提取码:8888
三个核心模块:主程序处理流程、图像变形处理和GIF序列生成。使用时需传入照片路径,程序会自动检测眼睛位置并生成眨眼动画。
import javax.imageio.;
import java.awt.;
import java.awt.image.;
import java.io.;
import java.util.ArrayList;
public class BlinkGenerator {
public static void main(String[] args) {
if (args.length < 1) {
System.out.println("Usage: java BlinkGenerator [output.gif]");
return;
}
String input = args[0];
String output = args.length > 1 ? args[1] : "output.gif";
try {
generateBlinkAnimation(input, output);
System.out.println("Successfully generated: " + output);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
public static void generateBlinkAnimation(String inputPath, String outputPath) throws IOException {
// 读取原始图片
BufferedImage original = ImageIO.read(new File(inputPath));
int width = original.getWidth();
int height = original.getHeight();
// 创建动画帧序列
ArrayList<BufferedImage> frames = new ArrayList<>();
// 添加原始帧(眼睛睁开)
frames.add(original);
// 生成半闭眼帧
frames.add(createHalfBlinkFrame(original));
// 生成全闭眼帧
frames.add(createFullBlinkFrame(original));
// 生成回半闭眼帧
frames.add(createHalfBlinkFrame(original));
// 保存为GIF
saveAsGif(frames, outputPath, 100);
}
private static BufferedImage createHalfBlinkFrame(BufferedImage original) {
// 实现半闭眼效果...
}
}
java.awt.;
import java.awt.image.;
public class ImageProcessor {
public static BufferedImage applyEyeEffect(BufferedImage image,
int eyeX, int eyeY,
int eyeWidth, int eyeHeight,
double closeRatio) {
// 创建副本
BufferedImage result = new BufferedImage(
image.getWidth(), image.getHeight(), image.getType());
Graphics2D g2d = result.createGraphics();
g2d.drawImage(image, 0, 0, null);
// 绘制半闭眼效果
g2d.setColor(Color.BLACK);
int newHeight = (int)(eyeHeight * closeRatio);
int yOffset = (eyeHeight - newHeight) / 2;
g2d.fillOval(eyeX, eyeY + yOffset, eyeWidth, newHeight);
g2d.dispose();
return result;
}
public static Point[] detectEyes(BufferedImage faceImage) {
// 简单的眼睛位置检测实现...
}
}
import javax.imageio.;
import javax.imageio.metadata.;
import javax.imageio.stream.;
import java.awt.image.;
import java.util.Iterator;
public class GifSequenceWriter {
protected ImageWriter gifWriter;
protected ImageWriteParam imageWriteParam;
protected IIOMetadata imageMetaData;
public GifSequenceWriter(ImageOutputStream outputStream,
int imageType, int delay,
boolean loop) throws IOException {
// 初始化GIF写入器...
}
public void writeToSequence(RenderedImage img) throws IOException {
// 写入帧到GIF...
}
public void close() throws IOException {
// 关闭写入器...
}
}