Programme Java pour redimensionner une photo dans un carré avec des marges

introduction

Ce que je voulais faire

――Lors de la publication d'une photo sur Instagram, je veux en faire un carré avec une marge

environnement

code

Que pouvez-vous faire

Texte intégral

image-resizer.java


package main;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.AreaAveragingScaleFilter;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.imageio.ImageIO;


import javafx.application.Application;
import javafx.stage.Stage;

public class Main extends Application {

	public static boolean makeSquare = true;;
	
	public static ArrayList<File> dirFiles = new ArrayList<File>();
	public static BufferedImage inputImage;
	public static double maxWidth = 1080;
	public static double maxHeight = 1350;
	
	public static int outputWidth;
	public static int outputHeight;

	public static int[] startCoodinate = {0, 0};
	public static Color background;
	
	public static String outputPreffix = "resized_";
	public static File output;
	public static String extension = "png";
	public static List<String> readble = Arrays.asList("jpeg", "jpg", "gif", "png", "bmp");
	
	
	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage primaryStage) throws Exception {
        Parameters params = getParameters();
		List<String> args = params.getRaw();
		
		switch(args.get(0)) {
		case "f":
			makeSquare = false;
			break;
		case "w":
			background = Color.white;
			break;
		case "b":
			background = Color.black;
			break;
		default:
			System.out.println("Input 'f', 'w' or 'b' as 1st argument.");
			System.exit(0);
		}
		
		if (args.size() > 1) {
			for (int i = 1; i < args.size(); i++) {
				System.out.println("Processing " + args.get(i) + ".");
				if (checkDirectory(args.get(i))) {
					for (File f: dirFiles) {
						System.out.println("Processing " + f.getName() + ".");
						initialize(f);
						scaleImage(inputImage, output, outputWidth, outputHeight);
					}
					dirFiles.clear();
				} else {
					try {
						initialize(new File(args.get(i)));
						scaleImage(inputImage, output, outputWidth, outputHeight);
					} catch (Exception e){
						System.out.println(new File(args.get(i)).getName() + " could not be loaded.");
					}
				}
			}
			System.exit(0);
		} else {
			System.out.println("Input file or directory name as 2nd and later arguments.");
			System.exit(0);
		}
	}
	
	public static void initialize(File input) throws Exception {
		inputImage = ImageIO.read(input);
	    calculateSize(inputImage);
	        
	    String fileNameWithoutExtension = input.getName().substring(0, input.getName().lastIndexOf(".") + 1);
	    output = new File(input.getParent(), outputPreffix + fileNameWithoutExtension + extension);
	}
	
	public static void calculateSize(BufferedImage org) {
		if (makeSquare) {
			maxHeight = maxWidth;
		}
		double scale = Math.min(maxWidth / org.getWidth(), maxHeight / org.getHeight());
		outputWidth = (int)(org.getWidth() * scale);
		outputHeight = (int)(org.getHeight() * scale);
		if (makeSquare) {
			startCoodinate[0] = (int)Math.max(0, (maxWidth - outputWidth) / 2);
			startCoodinate[1] = (int)Math.max(0, (maxHeight - outputHeight) / 2);
		}
	}
	
	public static boolean checkDirectory(String dir) {
		File inputDir = new File(dir);
		if(inputDir.isDirectory()) {
			for (File f: inputDir.listFiles()) {
				if (readble.contains(f.getName().substring(f.getName().lastIndexOf(".") + 1).toLowerCase())) {
					dirFiles.add(f);
				} else {
					System.out.println(f.getName() + " was skipped. Only JPG, GIF, PNG, BMP are supported.");
				}
			}
		}
		return inputDir.isDirectory();
	}
	
	public static void scaleImage(BufferedImage org, File out, int width, int height){
        try {
            ImageFilter filter = new AreaAveragingScaleFilter(width, height);
            ImageProducer p = new FilteredImageSource(org.getSource(), filter);
            Image dstImage = Toolkit.getDefaultToolkit().createImage(p);
            
            if (makeSquare) {
            	outputWidth = (int)maxWidth;
            	outputHeight = (int)maxHeight;
            }
            BufferedImage dst = new BufferedImage((int)outputWidth , (int)outputHeight, BufferedImage.TYPE_INT_ARGB);
        	Graphics2D g = dst.createGraphics();
        	g.setColor(background);
        	g.fillRect(0, 0, dst.getWidth(), dst.getHeight());
            g.drawImage(dstImage, Math.max(0, startCoodinate[0]), Math.max(0, startCoodinate[1]), null);
            g.dispose();
			ImageIO.write(dst, extension, out);
			System.out.println(out.getName() + " was successed.");
		} catch (IOException e) {
			System.out.println(out.getName() + " could not be written.");
		}
    }

}

Pour une utilisation simple

--Facile à utiliser les fichiers de commandes suivants sur les machines Windows

image-resizer.bat


@echo off
setlocal
set /p dir="Fichier ou dossier cible (plusieurs peuvent être spécifiés): "
set /p makeSqare="Souhaitez-vous ajouter une marge pour le rendre carré?(y/n): "
if %makeSqare%==y (
    set /p firstAug="La couleur de la marge est blanche ou noire(w/b): "
)
if %makeSqare%==n (
    set firstAug=f
)
echo Démarre le traitement
java -jar image-resizer.jar %firstAug% %dir%
echo Le PNG redimensionné est enregistré dans le même dossier que l'image d'origine
pause

référence

Commentaire de saka1029 de Image Resize --Qiita

Recommended Posts

Programme Java pour redimensionner une photo dans un carré avec des marges
[Introduction à Java] Comment écrire un programme Java
[Organiser les photos] [java] [windows] Déplacez les photos sélectionnées vers un dossier en 2 clics
Essayez de déboguer un programme Java avec VS Code
J'ai essayé de casser le bloc avec java (1)
Jusqu'à ce que vous exécutiez un programme Java avec le SDK AWS local sur Windows
Soumettre une tâche à AWS Batch avec Java (Eclipse)
Exporter le pdf avec un programme autonome (Java / Perl / VBA)
Essayez de créer Java dans un module natif avec GraalVM
[Java] Comment rompre une ligne avec StringBuilder
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
Java pour jouer avec Function
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Pour écrire un programme orienté utilisateur (1)
Un mémo pour démarrer la programmation Java avec VS Code (version 2020-04)
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
Comment s'inscrire en tant que client dans Square à l'aide de Tomcat
Comment gérer le type auquel j'ai pensé en écrivant un programme Java pendant 2 ans
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
Essayez d'accélérer le démarrage des programmes de console Java avec l'image native de GraalVM
Connexion à une base de données avec Java (partie 1) Peut-être la méthode de base
Remplacer par une valeur selon la correspondance avec une expression régulière Java
Construire un projet Java avec Gradle
Java pour apprendre avec les ramen [Partie 1]
[Java] Points à noter avec Arrays.asList ()
Comment créer un conteneur Java
Osez défier Kaggle avec Java (1)
J'ai essayé d'interagir avec Java
Java, des tableaux pour débuter avec les débutants
Comment créer un tableau Java
Une application Java autonome qui envoie des journaux à CloudWatch Logs avec slf4j / logback
[Mémo personnel] Comment interagir avec le générateur de nombres aléatoires en Java
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
Je souhaite créer un SNS Web sombre avec Jakarta EE 8 avec Java 11
Hanashi a trébuché un peu sur le chemin en essayant d'étudier Java avec VScode
Je veux ForEach un tableau avec une expression Lambda en Java
Comment SSH dans Ubuntu à partir d'un terminal avec authentification par clé publique
Comment créer une application avec un mécanisme de plug-in [C # et Java]
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
Comment créer un résumé de calendrier Java
Comment compiler Java avec VsCode & Ant
[Java] Résumez comment comparer avec la méthode equals
Introduction aux algorithmes avec java-Search (recherche prioritaire en profondeur)
Un programme qui calcule la puissance de 2 à 100
[Java] Comment mesurer le temps d'exécution du programme
Comment créer un robot Discord (Java)
Diviser une chaîne avec ". (Dot)" en Java
Désérialiser XML dans une collection avec spring-boot
Facile à parcourir avec les expressions régulières Java