Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Implementierung von Bildskalierung, Bildausschnitt, Typkonvertierung, Wasserzeichen und anderen Funktionen in Java

Detaillierte Erläuterung der Implementierung von Bildskalierung, Bildausschnitt, Typkonvertierung, Wasserzeichen und anderen Funktionen in Java

巴扎黑
巴扎黑Original
2017-08-01 11:36:241677Durchsuche

Die folgenden allgemeinen Funktionen können implementiert werden: Bilder skalieren, Bilder ausschneiden, Bildtypkonvertierung, Farbe in Schwarzweiß, Textwasserzeichen, Bildwasserzeichen usw.

Der Code lautet wie folgt: Kopieren Sie den Code
java.awt.AlphaComposite importieren;
java.awt.Color importieren;
java.awt.Font importieren;
java.awt.Graphics importieren;
java.awt.Graphics2D importieren;
java.awt.Image importieren;
java.awt.Toolkit importieren;
java.awt.color.ColorSpace importieren;
java.awt.geom.AffineTransform importieren;
java.awt importieren .image.AffineTransformOp;
import java .awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.CropImageFilter;
import java.awt.image .FilteredImageSource;
import java.awt .image.ImageFilter;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

/**
* Bildverarbeitungswerkzeuge:

* Funktionen: Bilder skalieren, Bilder ausschneiden, Bildtypkonvertierung, Farbe in Schwarzweiß, Textwasserzeichen, Bildwasserzeichen usw.
* @author Administrator
*/
public class ImageUtils {

/**
* Mehrere gängige Bildformate
*/
public static String IMAGE_TYPE_GIF = "gif";// Graphics Interchange Format
public static String IMAGE_TYPE_JPG = "jpg ";// Joint Photographic Experts Group
public static String IMAGE_TYPE_JPEG = "jpeg";// Joint Photographic Experts Group
public static String IMAGE_TYPE_BMP = "bmp";// Die Abkürzung für Englisch Bitmap (Bitmap) ist das Standardbilddateiformat im Windows-Betriebssystem
public static String IMAGE_TYPE_PNG = "png";// Portable Network Graphics
public static String IMAGE_TYPE_PSD = "psd"; // Photoshops Spezialformat Photoshop

/**
* Programmeintrag: zum Testen
* @param args
*/
public static void main(String[] args) {
// 1-Skalierung des Bildes:
// Methode 1: Proportional skalieren
ImageUtils .scale("e:/abc.jpg", "e:/abc_scale.jpg", 2, true);//Test OK
                                                                                           Verwendung mit                   Verwendung mit Off 's ' s ‐             through out using'''' through out ''s ‐ ‐‐‐‐‐‐‐‐ .scale("e:/abc.jpg", ""e:/abc_scale.jpg", 2, true ); "e:/abc.jpg", "e:/abc_scale2.jpg", 500, 300, true);//Test OK

// 2-Cut image:

// Methode eins: Schneiden Sie gemäß den angegebenen Startpunktkoordinaten sowie Breite und Höhe
ImageUtils.cut("e:/abc.jpg", "e:/abc_cut.jpg", 0, 0, 400, 400 );// Test OK
/ /Methode 2: Geben Sie die Anzahl der Zeilen und Spalten des Slice an
        ImageUtils.cut2("e:/abc.jpg", "e:/", 2, 2 ); OK
               :Geben Sie die Breite und Höhe des Slice an
ImageUtils.cut3("e:/abc.jpg", "e:/", 300, 300 );//Test OK

// 3-Bildtyp-Konvertierung:

ImageUtils.convert("e:/abc.jpg", "GIF", "e:/abc_convert.gif");//Test OK

// 4-Farbe zu Schwarzweiß:

ImageUtils.gray("e:/abc.jpg", "e:/abc_gray.jpg");//Test OK

// 5-Text hinzufügen Wasserzeichen zum Bild:

/ / Methode 1:
ImageUtils.pressText("Ich bin Wasserzeichentext", "e:/abc.jpg", "e:/abc_pressText.jpg", "宋体",Font .BOLD,Color.white,80, 0, 0, 0.5F); // Test OK
// Methode 2:
Imageutils.presstext2 ("Ich bin auch ein Wasserzeichentext", "e: /abc .jpg", "e: /abc_presterstext2.jpg", "Blackbody", 36, Color.white, 80, 0, 0, 0.5f);//Test.                                                                                                                                           e:/ abc2.jpg", " e:/abc.jpg", "e:/abc_pressImage.jpg", 0, 0, 0.5f);//Test OK
}

    /**
* Bild skalieren (skaliert)
* @param srcImageFile Quellbilddateiadresse
* @param Ergebnis skalierte Bildadresse
* @param Skalierungsverhältnis
* @param Flag Zoomauswahl: wahr zum Vergrößern; false zum Verkleinern;
*/
    public final static void scale(String srcImageFile, String result,
            int scale, boolean flag) {
        try {
          (neue Datei(srcImageFile)); // 读入文件
            int width = src.getWidth(); // 得到源图宽
            int height = src.getHeight(); // 得到源图长
            if (flag) {// 放大
               width = width * scale;
              height = height * scale;
            } {// 缩小
                width = width / scale;
                height = height / scale;
            }
            Image image = src.getScaledInstance(width, height,
                    Image.SCALE_DEFAULT);
            BufferedImage-Tag = neues BufferedImage(width, height ,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
            g.dispose();
            ImageIO.write(tag, "JPEG", new File(result)); // 输出到文件流
        } Catch (IOException. e ) {
            e.printStackTrace();
        }
    }

    /**
* Skaliertes Bild (skaliert nach Höhe und Breite)
* @param srcImageFile Adresse der Quellbilddatei
* @param result Skalierte Bildadresse
* @param height Skalierte Höhe
* @param width Die Breite nach der Skalierung
* @param bb Ob eine Auffüllung erforderlich ist, wenn die Proportionen falsch sind: true bedeutet Auffüllung; false bedeutet keine Auffüllung
*/
    public final static void scale2(String srcImageFile, String result, int height, int width, boolean bb) {
        try {
            double ratio = 0.0; // 缩放 比例
Datei f = Neue Datei (srcimageFile);
bufferedimage bi = imageio.read (f); >            // 计算比例
            if ((bi.getHeight() > height) || (bi.getWidth() > width)) {
                if (bi.getHeight() > bi.getWidth( )) {
                    ratio = (new Integer(height)).doubleValue()
                          / bi.getHeight();
                } else. {
                    Verhältnis = (neue Ganzzahl(breite)).doubleValue( ) / bi.getWidth();
               🎜>                itemp = op.filter(bi, null);
            }
            if (bb) {//补白
               BufferedImage image = new BufferedImage(width, height,
                       . BufferedImage.TYPE _INT_RGB);
                Graphics2D g = image.createGraphics();
                g.setColor(Color.white);
               g.fillRect(0, 0, width, height);
               if (width ==. itemp.getWidth(null))
              g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,
                         itemp.getWidth(null), itemp.getHeight(null),
                                   else
                    g .drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,
                          itemp.getWidth(null), itemp.getHeight(null),
                          Color.white, null);
                g.dispose();
                itemp = image;
          
            e.printStackTrace();
          int x, int y, int width, int height) {
        try {
            // 读取源图像
            BufferedImage bi = ImageIO.read(new File(srcImageFile));
            int. srcWidth = bi .getHeight(); // 源图宽度
            int srcHeight = bi.getWidth(); // 源图高度
            if (srcWidth > 0 && srcHeight > 0) {
                       Image.SCALE_DEFAULT);
                // 四个参数分别为图像起点坐标和宽高
               // 即: CropImageFilter(int x,int y,int width,int height)
              Breite, Höhe);
                Image img = Toolkit.getDefaultToolkit().createImage(
                       new FilteredImageSource(image.getSource(),
                            . CropFilter));               BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                g.drawImage(img, 0, 0, width, height, null); // 绘制切割后的图>               g.dispose();
                // 输出件
                ImageIO.write(tag, "JPEG", neu. Datei (Ergebnis));
            }
        } Catch (Ausnahme e) {
            e.printStackTrace();
        }
    切片的行数和列数)
     * @param srcImageFile 源图像地址
     * @param descDir 切片目标文件夹
     * @param rows须是范围 [1, 20] 之内
* @param cols Die Anzahl der Ziel-Slicing-Spalten. Standard 2, muss im Bereich [1, 20] liegen
*/
public final static void cut2(String srcImageFile, String descDir,
int rows, int cols) {
try {
/ Lesen Sie das Quellbild
buferedImage bi = imageio.read (neue Datei (srcimageFile));
int srcwidth = bi.getheight (); ) ; // Quellbildhöhe
if (srcWidth > 0 && srcHeight > 0) {
Image img;
ImageFilter cropFilter;
Image image = bi.getScaledInstance(srcWidth, srcHeight, Image . SCALE_DEFAULT);
int destWidth = srcWidth; // Die Breite jedes Slice
int destHeight = srcHeight; // Die Höhe jedes Slice
if (srcwidth % cols == 0) {
+ 1;
srcheight % Zeilen == 0) {
destheeight = srcheight / strei Math.floor(srcWidth / row s) + 1;
                                                          ing wird verwendet, um das Schneiden zu beschleunigen
for (int i = 0; i < ; rows; i++) {
for (int j = 0; j < ; cols; j++) {
                                                                                             cropFilter = neuer CropImageFilter (J * Destheight,
Destheight, Destheight); > IMG = Toolkit.getDefaultToolkit ().new FilteredImageSource(image.getSource(),
                                                                                                                                                                                                                                          destHeight, BufferedImage.TYPE_INT_RGB); > Für Datei
                     ImageIO.write(tag, "JPEG ", new File(descDir
                                                                                                                                                                                                                                                                                            {
e. printStackTrace();
}
}

/**
* Bildausschnitt (Breite und Höhe des Slice angeben)
* @param srcImageFile Quellbildadresse
* @param descDir Slice-Zielordner
* @param destWidth Ziel-Slice-Breite. Standard 200
* @param destHeight Ziel-Slice-Höhe. Standard 150
*/
public final static void cut3(String srcImageFile, String descDir,
int destWidth, int destHeight) {
try {
if(destWid th<= 0 ) destWidth = 200; // Slice-Breite
if(destHeight<=0) destHeight = 150; // Slice-Höhe
// Quellbild lesen
BufferedImage bi = ImageIO.read(new File(srcImageFile )); t; destHeight) {
Image img;
ImageFilter cropFilter;
Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);
              Anzahl der Slices
int rows = 0; // Anzahl der Slices in vertikaler Richtung th;
                                        }
if (srcheightheight == 0) {
rows = srcheight / destheigh;                                           Gedanken: Kann Multithreading verwendet werden, um das Schneiden zu beschleunigen
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
// Die vier Parameter sind die Startpunktkoordinaten sowie die Breite und Höhe des Bildes                                                                                                                                   // Das heißt: CropImageFilter(int x, int y, int width, int height) destWidth, destHeight);
img = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(image.getSource(),
                                                                                                                                                                                                                                          destHeight, BufferedImage.TYPE_INT_RGB); > Für Datei
                     ImageIO.write(tag, "JPEG ", new File(descDir
                                                                                                                                                                                                                                                                                            {
e. printStackTrace();
}
}

/**
* 图像类型转换:GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG
     * @param srcImageFile 源图像地址
     * @param formatName 包含格式非正式名称的 String:如JPG、JPEG、GIF等
     * @param destImageFile 目标图像地址
     */
    public final static void convert(String srcImageFile, String formatName, String destImageFile) {
        try {
            File f = new File(srcImageFile);
            f.canRead();
            f.canWrite();
            BufferedImage src = ImageIO.read(f);
            ImageIO.write(src, formatName, new File(destImageFile));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
* Farbe in Schwarzweiß konvertieren
* @param srcImageFile Quellbildadresse
* @param destImageFile Zielbildadresse
*/
    public final static void grey(String srcImageFile, String destImageFile) {
        try {
            BufferedImage src = ImageIO.read(new File(srcImageFile));
            ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
            ColorConvertOp op = new ColorConvertOp(cs, null);
            src = op.filter(src, null);
           . Bild IO.write(src , "JPEG", new File(destImageFile));
        } Catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
* Textwasserzeichen zum Bild hinzufügen
* @param pressText Wasserzeichentext
* @param srcImageFile Quellbildadresse
* @param destImageFile Zielbildadresse
* @param fontName Schriftartname des Wasserzeichen
* @param fontStyle Der Schriftstil des Wasserzeichens
* @param color Die Schriftfarbe des Wasserzeichens
* @param fontSize Die Schriftgröße des Wasserzeichens
* @param x Korrekturwert
* @param y Korrekturwert
* @param Alpha-Transparenz: Alpha muss eine Gleitkommazahl im Bereich [0,0, 1,0] (einschließlich Grenzwerte) sein
*/
    public final static void pressText(String pressText,
            String srcImageFile, String destImageFile, String fontName,
            int fontStyle, Color color, int fontSize,int x,
            int y, float alpha ) {
        try {
            File img = new File(srcImageFile);
            Image src = ImageIO.read(img);
            int width =. src.getWidth(null);
            int Höhe = src.getHeight (null);           g.drawImage(src, 0, 0, width, height, null);
            g.setColor(color);
            g.setFont(new Font(fontName, fontStyle, fontSize));
            g.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_ATOP,
                   alpha));
            // 在指定坐标绘制水印文字
           - (getLength(pressText) * fontSize))
                    / 2 + x , (height - fontSize) / 2 + y);
            g.dispose();
            ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));// 输出到文件流
        } Catch (Ausnahme e) {
            e.printStackTrace();
        }
    }

    /**
* Textwasserzeichen zum Bild hinzufügen
* @param pressText Wasserzeichentext
* @param srcImageFile Quellbildadresse
* @param destImageFile Zielbildadresse
* @param fontName Schriftartname
* @param FontStyle Schriftstil
* @param Color Schriftfarbe
* @param FontSize Schriftgröße
* @param x Korrekturwert
* @param y Korrekturwert
* @param alpha Transparenz: Alpha muss eine Gleitkommazahl
im Bereich [0,0, 1,0] sein (einschließlich Grenzwerte)*/
    public final static void pressText2(String pressText, String srcImageFile,String destImageFile,
            String FontName, int FontStyle, Color Color, int FontSize, int x,
int y, float alpha) {
        try {
            File img = new File(srcImageFile);
            Image src = ImageIO.read(img);
            int width = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(width, height, D g = image.createGraphics();
            g .drawImage (src, 0, 0, width, height, null); (AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                   alpha));
            // 在指定坐标绘制水印文字
           g.drawString(pressText, (width - (getLength(pressText) * fontSize))
                    / 2 + x, (Höhe - Schriftgröße) / 2 + y);
            g.dispose();
            ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));
        } Catch (Ausnahme e) {
            e.printStackTrace();
        }
    }

    /**
* Bildwasserzeichen zum Bild hinzufügen
* @param pressImg Wasserzeichenbild
* @param srcImageFile Quellbildadresse
* @param destImageFile Zielbildadresse
* @param x Korrekturwert. Standard ist in der Mitte
* @param y Korrekturwert. Der Standardwert liegt in der Mitte
* @param Alpha-Transparenz: Alpha muss eine Gleitkommazahl im Bereich [0,0, 1,0] (einschließlich Grenzwerte) sein
*/
    public final static void pressImage(String pressImg, String srcImageFile,String destImageFile,
            int x, int y, float alpha) {
        try {
File img = new File(srcImageFile);
            Image src = ImageIO.read(img);
            int wideth = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(width, height,
                   BufferedImage.TYPE_INT_RGB);
            Graphics2D g = image.createGraphics();
           . g.drawImage(src , 0, 0, Breite, Höhe, null) ;
            // 水印文件      int height_biao = src_biao.getHeight(null) ;
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                    alpha));
            g.drawImage(src_biao, (wideth - wideth_biao) / 2,
                    (height - height_biao) / 2 , wideth_biao, height_biao, null);
            // 水印文件结束
            g.dispose();
            ImageIO.write((BufferedImage) image,  "JPEG", new File(destImageFile));
 ) {
        int length = 0;
        for (int i = 0; ich < text.length(); i++) {
            if (new String(text.charAt(i) + "").getBytes().length > 1) {
                length += 2;
            } else {
                length += 1;

            }

        }
        Rückgabelänge / 2;
    }
}

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Implementierung von Bildskalierung, Bildausschnitt, Typkonvertierung, Wasserzeichen und anderen Funktionen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn