watermark ok
This commit is contained in:
5
pom.xml
5
pom.xml
@@ -19,6 +19,11 @@
|
|||||||
<artifactId>ij</artifactId>
|
<artifactId>ij</artifactId>
|
||||||
<version>1.51h</version>
|
<version>1.51h</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.15.1</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -2,38 +2,34 @@ package org.example;
|
|||||||
|
|
||||||
import ij.IJ;
|
import ij.IJ;
|
||||||
import ij.ImagePlus;
|
import ij.ImagePlus;
|
||||||
import ij.process.ImageProcessor;
|
import ij.process.ImageConverter;
|
||||||
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
/*
|
|
||||||
TODO:
|
|
||||||
- Parse properly the CLI arguments
|
|
||||||
- Add error handling
|
|
||||||
- Write many lines with an angle
|
|
||||||
- Write for any image (format & responsiveness)
|
|
||||||
- optional: Export to PDF?
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
if (args.length == 0)
|
if (args.length == 0)
|
||||||
{
|
{
|
||||||
System.out.println("Usage: java -jar watermark.jar <input file> -s <string> [-o <output file>]");
|
System.out.println("librewatmark - libre watermark tool\nUsage: <input file> -s <string> [-o <output file>]");
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String filename = null;
|
||||||
File f = null;
|
File f = null;
|
||||||
|
String watermark = null;
|
||||||
|
String outputfile = null;
|
||||||
|
|
||||||
for (int i=0; i<args.length; i++)
|
for (int i=0; i<args.length; i++)
|
||||||
{
|
{
|
||||||
System.out.println("Argument " + i + ": " + args[i]);
|
//System.out.println("Argument " + i + ": " + args[i]);
|
||||||
|
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
// First argument is input file, if not, gtfo here
|
// First argument is input file, if not, gtfo here
|
||||||
String filename = args[i];
|
filename = args[i];
|
||||||
f = new File(filename);
|
f = new File(filename);
|
||||||
if (!f.exists() || f.isDirectory()) {
|
if (!f.exists() || f.isDirectory()) {
|
||||||
System.out.println("Input file \"" + filename + "\" does not exist.");
|
System.out.println("Input file \"" + filename + "\" does not exist.");
|
||||||
@@ -45,10 +41,12 @@ public class Main {
|
|||||||
case '-':
|
case '-':
|
||||||
switch (args[i].charAt(1)) {
|
switch (args[i].charAt(1)) {
|
||||||
case 's': // -s string: to be put as watermark
|
case 's': // -s string: to be put as watermark
|
||||||
System.out.println("OPTION B");
|
watermark = args[i+1];
|
||||||
|
i++;
|
||||||
break;
|
break;
|
||||||
case 'o': // -o file: output file
|
case 'o': // -o file: output file
|
||||||
System.out.println("OPTION C");
|
outputfile = args[i+1];
|
||||||
|
i++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
System.out.println("Unknown argument: \"" + args[i] + "\"");
|
System.out.println("Unknown argument: \"" + args[i] + "\"");
|
||||||
@@ -59,15 +57,58 @@ public class Main {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// test
|
if (outputfile == null)
|
||||||
ImagePlus image = IJ.openImage(f.getAbsolutePath());
|
{
|
||||||
Font font = new Font("Arial", Font.PLAIN, 18);
|
outputfile = FilenameUtils.removeExtension(filename) + "-watermark";
|
||||||
ImageProcessor ip = image.getProcessor();
|
}
|
||||||
ip.setColor(Color.WHITE);
|
|
||||||
ip.setFont(font);
|
|
||||||
ip.drawString("Watermark Text", 10, 20);
|
|
||||||
image.updateAndDraw();
|
|
||||||
IJ.save(image, "output.png");
|
|
||||||
|
|
||||||
|
if (watermark == null)
|
||||||
|
{
|
||||||
|
System.out.println("No watermark text provided.");
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImagePlus image = IJ.openImage(f.getAbsolutePath());
|
||||||
|
|
||||||
|
if (image.getType() != ImagePlus.COLOR_RGB) {
|
||||||
|
ImageConverter ic = new ImageConverter(image);
|
||||||
|
ic.convertToRGB();
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferedImage bufferedImage = image.getBufferedImage();
|
||||||
|
|
||||||
|
Graphics2D g2d = bufferedImage.createGraphics();
|
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
|
||||||
|
RenderingHints.VALUE_ANTIALIAS_ON);
|
||||||
|
|
||||||
|
Font font = new Font("Arial", Font.PLAIN, 18);
|
||||||
|
g2d.setFont(font);
|
||||||
|
g2d.setColor(new Color(0, 0, 0, 180));
|
||||||
|
|
||||||
|
double angle = Math.toRadians(-45);
|
||||||
|
g2d.rotate(angle,
|
||||||
|
bufferedImage.getWidth() / 2.0,
|
||||||
|
bufferedImage.getHeight() / 2.0);
|
||||||
|
|
||||||
|
FontMetrics fm = g2d.getFontMetrics();
|
||||||
|
int textWidth = fm.stringWidth(watermark);
|
||||||
|
int textHeight = fm.getHeight();
|
||||||
|
|
||||||
|
for (int y = -bufferedImage.getHeight(); y < bufferedImage.getHeight() * 2; y += textHeight * 4) {
|
||||||
|
for (int x = -bufferedImage.getWidth(); x < bufferedImage.getWidth() * 2; x += textWidth + 50) {
|
||||||
|
g2d.drawString(watermark, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g2d.dispose();
|
||||||
|
|
||||||
|
ImagePlus out = new ImagePlus("watermarked", bufferedImage);
|
||||||
|
|
||||||
|
if (!outputfile.matches(".*\\.(png|jpg|jpeg|tif|tiff)$")) {
|
||||||
|
outputfile += ".png";
|
||||||
|
}
|
||||||
|
|
||||||
|
IJ.save(out, outputfile);
|
||||||
|
System.out.println("Watermarked file saved as \"" + outputfile + "\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user