java-多图片拼接并增加底色照片

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.List;


public class ResizedImageOpenPolitics {

    public static void main(String[] args) {
        //TODO 图片源头在哪个文件夹下
        String inputFolderPath = "F:/shareInIpad";
        //TODO 生成文件的路径及名称
        String outputFilePath = "F:/result.jpg";
        //TODO 底色图片路径
        String baseImageFilePath = "F:/shareInIpad/4321.PNG";
        float alpha = 0.5f;
        try {
            List<File> imageFiles = getUniqueImageFiles(inputFolderPath);
            int imageSize = (int) Math.ceil(Math.sqrt(imageFiles.size()));
            int collageSize = imageSize * 100; // Each image is assumed to be 100x100 pixels

            // 创建一个新的BufferedImage对象,用于拼接图片
            BufferedImage collage = new BufferedImage(collageSize, collageSize, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = collage.createGraphics();

            // 遍历图片并按比例缩小后拼接
            int x = 0, y = 0;
            for (File imageFile : imageFiles) {
                BufferedImage originalImage = ImageIO.read(imageFile);
                BufferedImage resizedImage = resizeImage(originalImage, 100, 100);

                g.drawImage(resizedImage, x * 100, y * 100, null);

                x++;
                if (x >= imageSize) {
                    x = 0;
                    y++;
                }
            }

            g.dispose();

            // 添加指定的图片
            String overlayImagePath = baseImageFilePath; // 指定图片的路径
            BufferedImage overlayImage = ImageIO.read(new File(overlayImagePath));


            // 确保overlayImage的尺寸足够大,可以覆盖collage
            int collageWidth = collage.getWidth();
            int collageHeight = collage.getHeight();
            if (overlayImage.getWidth() < collageWidth || overlayImage.getHeight() < collageHeight) {
                // 如果overlayImage尺寸小于collage,需要调整尺寸
                BufferedImage resizedOverlayImage = new BufferedImage(collageWidth, collageHeight, BufferedImage.TYPE_INT_ARGB);
                Graphics2D g2d = resizedOverlayImage.createGraphics();
                //TODO
                g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f)); // 设置透明度为70%
                //TODO
                g2d.drawImage(overlayImage, 0, 0, collageWidth, collageHeight,null);
//                g2d.drawImage(resizedOverlayImage, 0, 0, null);
                g2d.dispose();
                overlayImage = resizedOverlayImage;
            }

            // 绘制overlayImage到collage上
            Graphics2D g2d = collage.createGraphics();
            //TODO 设置底照透明度
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f)); // 设置透明度为70%
            g2d.drawImage(overlayImage, 0, 0, null);
            g2d.dispose();

            // 保存最终的图片
            ImageIO.write(collage, "png", new File(outputFilePath));
            System.out.println("Collage with overlay generated successfully!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private static List<File> getUniqueImageFiles(String folderPath) {
        Set<String> hashSet = new HashSet<>();
        List<File> uniqueImageFiles = new ArrayList<>();

        File folder = new File(folderPath);
        File[] files = folder.listFiles();

        if (files != null) {
            for (File file : files) {
                //TODO 源头文件类型
                if (file.isFile() && file.getName().toLowerCase().endsWith(".png")) {
                    String hash = getHash(file);
                    if (!hashSet.contains(hash)) {
                        hashSet.add(hash);
                        uniqueImageFiles.add(file);
                    }
                }
            }
        }

        return uniqueImageFiles;
    }


    private static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) {
        Image resultingImage = originalImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH);
        BufferedImage outputImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB);

        Graphics2D g2d = outputImage.createGraphics();
        g2d.drawImage(resultingImage, 0, 0, null);
        g2d.dispose();

        return outputImage;
    }



    private static String getHash(File file) {
        try {
            BufferedImage image = ImageIO.read(file);
            if (image != null) {
                int[] pixels = image.getRGB(0, 0, image.getWidth(), image.getHeight(), null, 0, image.getWidth());
                return Arrays.hashCode(pixels) + "";
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }



    private static BufferedImage createFadedOverlayImage(BufferedImage overlayImage, float alpha) {
        int width = overlayImage.getWidth();
        int height = overlayImage.getHeight();
        BufferedImage fadedOverlayImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        Graphics2D g2d = fadedOverlayImage.createGraphics();
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
        g2d.drawImage(overlayImage, 0, 0, null);
        g2d.dispose();

        return fadedOverlayImage;
    }

















}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值