Java-Programm zum Ändern der Größe eines Fotos in ein Quadrat mit Rändern

Einführung

Was ich machen wollte

――Wenn Sie ein Foto auf Instagram veröffentlichen, möchte ich es zu einem Quadrat mit einem Rand machen

Umgebung

Code

Was kannst du tun

Voller Text

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.");
		}
    }

}

Zur Erleichterung der Bedienung

image-resizer.bat


@echo off
setlocal
set /p dir="Zieldatei oder Ordner (mehrere können angegeben werden): "
set /p makeSqare="Möchten Sie einen Rand hinzufügen, um ihn quadratisch zu machen?(y/n): "
if %makeSqare%==y (
    set /p firstAug="Die Randfarbe ist weiß oder schwarz(w/b): "
)
if %makeSqare%==n (
    set firstAug=f
)
echo Startet die Verarbeitung
java -jar image-resizer.jar %firstAug% %dir%
echo Das PNG mit geänderter Größe wird im selben Ordner wie das Originalbild gespeichert
pause

Referenz

Kommentar von saka1029 von Image Resize --Qiita

Recommended Posts

Java-Programm zum Ändern der Größe eines Fotos in ein Quadrat mit Rändern
[Einführung in Java] So schreiben Sie ein Java-Programm
[Fotos organisieren] [Java] [Fenster] Verschieben Sie ausgewählte Fotos mit 2 Klicks in einen Ordner
Versuchen Sie, ein Java-Programm mit VS-Code zu debuggen
Ich habe versucht, den Block mit Java zu brechen (1)
Bis Sie ein Java-Programm mit dem für Windows lokalen AWS SDK ausführen
Senden Sie einen Job an AWS Batch mit Java (Eclipse)
PDF mit einem eigenständigen Programm (Java / Perl / VBA) exportieren
Versuchen Sie, Java mit GraalVM in ein natives Modul zu integrieren
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Java zum Spielen mit Function
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Stellen Sie mit Java eine Verbindung zur Datenbank her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
So schreiben Sie ein benutzerorientiertes Programm (1)
Ein Memo zum Starten der Java-Programmierung mit VS Code (Version 2020-04)
So reduzieren Sie die Programmlast ein wenig, wenn Sie Zeichen mit JAVA kombinieren
So registrieren Sie sich mit Tomcat als Kunde in Square
Wie gehe ich mit dem Typ um, den ich 2 Jahre lang über das Schreiben eines Java-Programms nachgedacht habe?
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
Versuchen Sie, den Start von Java-Konsolenprogrammen mit dem nativen Image von GraalVM zu beschleunigen
Herstellen einer Verbindung zu einer Datenbank mit Java (Teil 1) Möglicherweise die grundlegende Methode
Ersetzen Sie durch einen Wert entsprechend der Übereinstimmung mit einem regulären Java-Ausdruck
Erstellen eines Java-Projekts mit Gradle
Java mit Ramen lernen [Teil 1]
[Java] Mit Arrays.asList () zu beachtende Punkte
So erstellen Sie einen Java-Container
Wagen Sie es, Kaggle mit Java herauszufordern (1)
Ich habe versucht, mit Java zu interagieren
Java, Arrays für Anfänger
So erstellen Sie ein Java-Array
Eine eigenständige Java-App, die Protokolle mit slf4j / logback an CloudWatch-Protokolle sendet
[Persönliches Memo] Interaktion mit dem Zufallszahlengenerator in Java
[Java] So drehen Sie ein zweidimensionales Array mit einer erweiterten for-Anweisung
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
Ich möchte mit Jakarta EE 8 mit Java 11 ein dunkles Web-SNS erstellen
Hanashi stolperte ein wenig auf dem Weg, Java mit VScode zu studieren
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
SSH in Ubuntu von einem Terminal mit öffentlicher Schlüsselauthentifizierung
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
So erstellen Sie eine Java-Kalenderzusammenfassung
So kompilieren Sie Java mit VsCode & Ant
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
Ein Programm, das die Leistung von 2 bis 100 berechnet
[Java] So messen Sie die Programmausführungszeit
Wie erstelle ich einen Discord Bot (Java)
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Deserialisieren Sie XML mit Spring-Boot in eine Sammlung
Einfach mit regulären Java-Ausdrücken zu stolpern