Ich muss Java Bild zuschneiden und Größe ändern, ohne einen X-Server.Java kopflose bicubic Bildgröße ändern
Ich habe mehrere Methoden ausprobiert. die erste Methode unten funktioniert, aber gibt ein ziemlich hässlich Größe geänderte Bild (wahrscheinlich am nächsten Nachbarn-Algorithmus für die Resize mit:
static BufferedImage createResizedCopy(Image originalImage, int scaledWidth, int scaledHeight, boolean preserveAlpha)
{
int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
Graphics2D g = scaledBI.createGraphics();
if (preserveAlpha)
{
g.setComposite(AlphaComposite.Src);
}
g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();
return scaledBI;
}
So entschied ich mich bicubic Resize zu verwenden, die bessere Ergebnisse erzielen lassen:
public static BufferedImage createResizedCopy(BufferedImage source, int destWidth, int destHeight, Object interpolation)
{
if (source == null) throw new NullPointerException("source image is NULL!");
if (destWidth <= 0 && destHeight <= 0) throw new IllegalArgumentException("destination width & height are both <=0!");
int sourceWidth = source.getWidth();
int sourceHeight = source.getHeight();
double xScale = ((double) destWidth)/(double) sourceWidth;
double yScale = ((double) destHeight)/(double) sourceHeight;
if (destWidth <= 0)
{
xScale = yScale;
destWidth = (int) Math.rint(xScale * sourceWidth);
}
if (destHeight <= 0)
{
yScale = xScale;
destHeight = (int) Math.rint(yScale * sourceHeight);
}
GraphicsConfiguration gc = getDefaultConfiguration();
BufferedImage result = gc.createCompatibleImage(destWidth, destHeight, source.getColorModel().getTransparency());
Graphics2D g2d = null;
try
{
g2d = result.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, interpolation);
AffineTransform at = AffineTransform.getScaleInstance(xScale, yScale);
g2d.drawRenderedImage(source, at);
}
finally
{
if (g2d != null) g2d.dispose();
}
return result;
}
public static GraphicsConfiguration getDefaultConfiguration()
{
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
return gd.getDefaultConfiguration();
}
Diese
funktionierte gut, bis ich versuchte, es auf dem Server zu setzen, und an diesem Punkt traf ich java.awt.HeadlessException. meine Versuche mit java.awt.headless zu spielen = true fehlgeschlagen.
So, Hier ist die Frage: Wie skaliere ich und zuschneiden und Bild in Java ohne einen X-Server, mit einem bikubischen Interpolationsalgorithmus?
Antwort: den Code aus Bozho Kommentar Verwendung, habe ich diese Funktion, die den Trick (Interpolation * wird RenderingHints.VALUE_INTERPOLATION_ soll).
public static BufferedImage createResizedCopy(BufferedImage source, int destWidth, int destHeight, Object interpolation)
{
BufferedImage bicubic = new BufferedImage(destWidth, destHeight, source.getType());
Graphics2D bg = bicubic.createGraphics();
bg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, interpolation);
float sx = (float)destWidth/source.getWidth();
float sy = (float)destHeight/source.getHeight();
bg.scale(sx, sy);
bg.drawImage(source, 0, 0, null);
bg.dispose();
return bicubic;
}
das funktioniert, danke! Aktualisieren meiner Frage mit der endgültigen Version der Funktion zum Ändern der Größe. –