Maison  >  Article  >  Java  >  Explication détaillée de la mise en œuvre de la mise à l'échelle, de la découpe, de la conversion de type, du filigrane et d'autres fonctions d'image en Java

Explication détaillée de la mise en œuvre de la mise à l'échelle, de la découpe, de la conversion de type, du filigrane et d'autres fonctions d'image en Java

巴扎黑
巴扎黑original
2017-08-01 11:36:241699parcourir

Les fonctions courantes suivantes peuvent être implémentées : mise à l'échelle des images, découpe d'images, conversion du type d'image, couleur en noir et blanc, filigrane de texte, filigrane d'image, etc.

Le code est le suivant Copiez le code
importer java.awt.AlphaComposite;
importer java.awt.Color;
importer java.awt.Font;
importer java.awt.Graphics;
importer java.awt.Graphics2D;
importer java.awt.Image;
importer java.awt.Toolkit;
importer java.awt.color.ColorSpace;
importer java.awt.geom.AffineTransform;
importer java.awt .image.AffineTransformOp;
importer java .awt.image.BufferedImage;
importer java.awt.image.ColorConvertOp;
importer java.awt.image.CropImageFilter;
importer java.awt.image .FilteredImageSource;
importer java.awt .image.ImageFilter;
importer java.io.File;
importer java.io.IOException;

importer javax.imageio.ImageIO;

/**
* Outils de traitement d'images :

* Fonctions : mise à l'échelle des images, découpe d'images, conversion du type d'image, couleur en noir et blanc, filigranes de texte, filigranes d'images, etc.
* @author Administrator
*/
public class ImageUtils {

/**
* Plusieurs formats d'images courants
*/
public static String IMAGE_TYPE_GIF = "gif";// Format d'échange graphique
public static String IMAGE_TYPE_JPG = "jpg ";// Groupe conjoint d'experts en photographie
public static String IMAGE_TYPE_JPEG = "jpeg";// Groupe conjoint d'experts en photographie
public static String IMAGE_TYPE_BMP = "bmp";// L'abréviation de l'anglais Bitmap (bitmap), c'est le format de fichier image standard dans le système d'exploitation Windows
public static String IMAGE_TYPE_PNG = "png";// Portable Network Graphics
public static String IMAGE_TYPE_PSD = "psd"; // Format spécial Photoshop Photoshop

/**
* Entrée du programme : pour tester
* @param args
*/
public static void main(String[] args) {
// 1-Redimensionner l'image :
// Méthode 1 : Mettre à l'échelle proportionnellement
ImageUtils .scale("e:/abc.jpg", "e:/abc_scale.jpg", 2, true);//Test OK
                                                                                                             utiliser utiliser utiliser                   grâce à l'utilisation de off ' s ' en utilisant  ‐ ‐out-out-through‐. "e:/abc.jpg", "e:/abc_scale2.jpg", 500, 300, true);//Test OK

/ / 2-Image découpée :

// Première méthode : Découper selon les coordonnées du point de départ spécifiées, ainsi que la largeur et la hauteur
ImageUtils.cut("e:/abc.jpg", "e:/abc_cut.jpg" , 0, 0, 400, 400 );//Test OK
/ / Méthode 2 : Préciser le nombre de lignes et de colonnes de la tranche
         ImageUtils.cut2("e:/abc.jpg", "e :/", 2, 2); // Test OK
                 : Précisez la largeur et la hauteur de la tranche
Imageutils.cut3 ("E: /abc.jpg", "E:/", 300, 300 ); // Test OK

// 3- Conversion du type d'image :

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

// 4 couleurs vers noir et blanc :

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

// 5-Ajouter un filigrane de texte à l'image :

// Méthode 1 :
ImageUtils.pressText("Je suis un texte en filigrane","e:/abc.jpg","e :/abc_pressText.jpg","宋体",Font.BOLD,Color.white,80, 0, 0, 0.5F); // Test OK
// Méthode 2 :
Imageutils.presterstext2 ("I suis aussi un texte en filigrane", "e: /abc.jpg", "e: /abc_presterstext2.jpg ", "Blackbody", 36, Color.white, 80, 0, 0, 0.5f);//Test OK
                                                                                                                                                   e:/abc2.jpg", "e:/abc.jpg", "e:/abc_pressImage.jpg", 0, 0, 0.5f);//Test OK
}

    /**
* Mettre à l'échelle l'image (mise à l'échelle)
* @param srcImageFile adresse du fichier image source
* @param adresse de l'image mise à l'échelle du résultat
* @param rapport de mise à l'échelle de l'échelle
* @param flag Sélection du zoom : vrai pour zoomer ; false pour dézoomer ;
*/
    échelle de vide statique finale publique (String srcImageFile, résultat de chaîne,
            échelle int, drapeau booléen) {
        essayez {
            BufferedImage src = ImageIO.read (nouveau fichier (srcImageFile)); // 读入文件
             int width = src.getWidth(); // 得到源图宽
            int height = src.getHeight(); // 得到源图长
            if (drapeau) {// 放大
                width = width * scale;
                height = height * scale;
            } {// 缩小
                 largeur = largeur / échelle;
                hauteur = hauteur / échelle;
            }
            Image image = src.getScaledInstance(largeur, hauteur,
                     Image.SCALE_DEFAULT);
            Balise BufferedImage = new BufferedImage (largeur, hauteur ,
                    BufferedImage.TYPE_INT_RGB);
            Graphiques g = tag.getGraphics();
             g.drawImage(image, 0, 0, null); // 绘制 缩小 后 的 图
g.dispose ();
imageo.write (tag, "jpeg", nouveau fichier (résultat)); // 输出 到 文件 流
} catch (ioexception e ) {
            e.printStackTrace();
        }
    }

    /**
* Image mise à l'échelle (mise à l'échelle en hauteur et en largeur)
* @param srcImageFile Adresse du fichier image source
* @param result Adresse de l'image mise à l'échelle
* @param height Hauteur mise à l'échelle
* @param width La largeur après la mise à l'échelle
* @param bb Si un remplissage est nécessaire lorsque la proportion est erronée : true signifie un remplissage false signifie aucun remplissage
;*/
    public final static void scale2(String srcImageFile, String result, int height, int width, boolean bb) {
        try {
             double ratio = 0.0 ; // 缩放比例
            File f = new File(srcImageFile);
            BufferedImage bi = ImageIO.read(f);
            Image itemp = bi.getScaledInstance(width, height, bi.SCALE_SMOOTH);
            // 计算比例
            if ((bi.getHeight() > height) || (bi.getWidth() > width)) {
                if (bi.getHeight() > bi.getWidth( )) {
                    ratio = (new Integer(height)).doubleValue()
                          / bi.getHeight();
                } else {
                    ratio = (new Integer(width)).doubleValue( ) / bi.getWidth();
                }
                AffineTransformOp op = new AffineTransformOp(AffineTransform
                        .getScaleInstance(ratio, ratio), null);
                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, (hauteur - itemp.getHeight(null)) / 2,
                          itemp.getWidth(null), itemp.getHeight(null),
                           Color.white, null);
                autre
                    g .drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,
                           itemp.getWidth(null), itemp.getHeight(null),
                            Color.white, nul);
                g.dispose();
                itemp = image;
             }
            ImageIO.write((BufferedImage) itemp, "JPEG", nouveau fichier (résultat));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    /**
* Découpe de l'image (coupée selon les coordonnées du point de départ, la largeur et la hauteur spécifiées)
* @param srcImageFile adresse de l'image source
* @param adresse de l'image résultat après le découpage
* @param x début de la tranche cible coordonnée du point X
* @param y Coordonnée du point de départ de la tranche cible Y
* @param width Largeur de la tranche cible
* @param height Hauteur de la tranche cible
*/
    public final static void cut(String srcImageFile, String result,
           int x, int y, int width, int height) {
        try {
            // 读取源图像
            BufferedImage bi = ImageIO.read(new File(srcImageFile));
            int s rcLargeur = bi .getHauteur(); // 源图宽度
             int srcHeight = bi.getWidth(); // 源图高度
            if (srcWidth > 0 && srcHeight > 0) {
                Image image = bi.getScaledInstance(srcWidth,
                        Image.SCALE_DEFAULT);
                // 四个参数分别为图像起点坐标和宽高
                // 即 : CropImageFilter(int x,int y,int width,int height)
                ImageFilter cropImageFilter = new y, largeur, hauteur);
                Image img = Toolkit.getDefaultToolkit().createImage(
                       new FilteredImageSource(image.getSource(),
                               cropFilter));
                Balise BufferedImage = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_RGB);
                Graphiques g = tag.getGraphics();
               g.drawImage(img, 0, 0, width, height, null); // 绘制切割后的图
                g.dispose();
                // 输出为文件
               ImageIO.write(tag, "JPEG", new File( résultat));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }切片的行数和列数)
     * @param srcImageFile 源图像地址
     * @param descDir 切片目标文件夹
     * @param rows须是范围 [1, 20] 之内
* @param cols Le nombre de colonnes de découpage cible. Par défaut 2, doit être compris dans la plage [1, 20]
*/
public final static void cut2(String srcImageFile, String descDir,
int rows, int cols) {
try {
                                                                                                                                                                                                                                                            / Lire l'image source
BufferedImage bi = ImageIO.read(new File(srcImageFile));
int srcWidth = bi.getHeight(); // Largeur de l'image source
int srcHeight = bi.getWidth( ) ; // Hauteur de l'image source
if (srcWidth > 0 && srcHeight > 0) {
Image img;
ImageFilter cropFilter;
Image image = bi.getScaledInstance(srcWidth, srcHeight, Image . SCALE_DEFAULT);
int destWidth = srcWidth; // La largeur de chaque tranche
int destHeight = srcHeight; // La hauteur de chaque tranche
// Calcule la largeur et la hauteur de la tranche
if (srcWidth % cols == 0) {
                                                                                                                             + 1;
                                                                                                 srcHeight % lignes == 0) {
destHeight = srcHeight / lignes;
} else {
destHeight = (int) Math.floor(srcWidth / row s) + 1;
                                                                       / Boucle pour créer des tranches
// Idées d'amélioration : Peut multi-threading être utilisé pour accélérer la coupe
pour (int i = 0; i < ; lignes; i++) {
pour (int j = 0; j < ; cols; j++) {
                                                                                                                   cropFilter = new CropImageFilter (J * Destwidth, I * Destheight,
Destwidth, Desteight IMG = Toolkit.getDefaultToolkit (
).new FilteredImageSource(image.getSource(),
                                                                                                                                                                                                                                                            destHeight, BufferedImage.TYPE_INT_RGB); > Pour le fichier
                       ImageIO.write(tag, "JPEG ", new File(descDir
                                                                                                      🎜>                                                                                                                                                                                                    {
e. printStackTrace();
}
}

/**
* Découpe d'image (précisez la largeur et la hauteur de la tranche)
* @param srcImageFile adresse de l'image source
* @param descDir dossier cible de la tranche
* @param destWidth largeur de tranche cible. Par défaut 200
* @param destHeight hauteur de tranche cible. Par défaut 150
*/
public final static void cut3(String srcImageFile, String descDir,
int destWidth, int destHeight) {
try {
if(destWid th<= 0 ) destWidth = 200; // Largeur de la tranche
if(destHeight<=0) destHeight = 150; // Hauteur de la tranche
// Lire l'image source
BufferedImage bi = ImageIO.read(new File(srcImageFile )); t; destHeight) {
Image img;
ImageFilter cropFilter;
Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);
                int cols = 0; number of slices
int rows = 0; // Nombre de tranches dans le sens vertical
// Calculer le nombre de tranches dans le sens horizontal et vertical th;
                                             
                                                                                                                                                                                                                                    rows = srcHeight / destHeight; {
                                                                                                                       Réflexions : Le multithreading peut-il être utilisé pour accélérer la coupe
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++ ) {
// Les quatre paramètres sont les coordonnées du point de départ ainsi que la largeur et la hauteur de l'image.                                                                                                           // C'est à dire : Crop ImageFilter(int x, int y, int largeur, int hauteur) destWidth, destHeight);
img = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(image.getSource(),
                                                                                                                                                                                                                                                            destHeight, BufferedImage.TYPE_INT_RGB); > Pour le fichier
                       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();
        }
    }

    /**
* Convertir la couleur en noir et blanc
* @param srcImageFile Adresse de l'image source
* @param destImageFile Adresse de l'image de destination
*/
    public final static void gray(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);
            ImageIO. écrire(src , "JPEG", new File(destImageFile));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
* Ajouter un filigrane de texte à l'image
* @param pressText texte du filigrane
* @param srcImageFile adresse de l'image source
* @param destImageFile adresse de l'image cible
* @param fontName nom de la police du watermark
* @param fontStyle Le style de police du filigrane
* @param color La couleur de la police du filigrane
* @param fontSize La taille de la police du filigrane
* @param x Valeur de correction
* @param y Valeur de correction
* @param alpha transparence : alpha doit être un nombre à virgule flottante compris dans la plage [0.0, 1.0] (y compris les valeurs limites)
*/
    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 ) {
        essayer {
            File img = new File(srcImageFile);
            Image src = ImageIO.read(img);
            int width = src.getWidth(null);
            hauteur int = src.getHeight(null);
            BufferedImage image = new BufferedImage(width, height,
                   BufferedImage.TYPE_INT_RGB);
             Graphics2D g =          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));
            // 在指定坐标绘制水印文字
            g.drawString(pressText, (width - (getLength(pressText) * fontSize))
                    / 2 + x , (hauteur - fontSize) / 2 + y);
            g.dispose();
            ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));// 输出到文件流
        } catch (Exception e) {
             e.printStackTrace();
        }
    }

    /**
* Ajouter un filigrane de texte à l'image
* @param pressText texte du filigrane
* @param srcImageFile adresse de l'image source
* @param destImageFile adresse de l'image cible
* @param fontName nom de la police
* @param fontStyle style de police
* @param color font color
* @param fontSize taille de police
* @param x valeur de correction
* @param y valeur de correction
* @param alpha transparence : alpha doit être un nombre à virgule flottante
compris dans la plage [0.0, 1.0] (y compris les valeurs limites)*/
    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) {
        essayer {
             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,
                    BufferedImage.TYPE_INT_RGB);
            s2D g = image.createGraphics();
            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));
            // 在指定坐标绘制水印文字
            g. drawString(pressText, (width - (getLength(pressText) * fontSize))
                    / 2 + x, (hauteur - fontSize) / 2 + y);
            g.dispose();
            ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));
        } catch (Exception e) {
             e.printStackTrace();
        }
    }

    /**
* Ajouter un filigrane d'image à l'image
* @param pressImg image de filigrane
* @param srcImageFile adresse de l'image source
* @param destImageFile adresse de l'image cible
* @param x valeur de correction. La valeur par défaut est au milieu
* @param y valeur de correction. La valeur par défaut est au milieu
* @param alpha transparence : alpha doit être un nombre à virgule flottante compris dans la plage [0.0, 1.0] (y compris les valeurs limites)
*/
    public final static void pressImage(String pressImg, String srcImageFile,String destImageFile,
            int x, int y, float alpha) {
        essayer {
Fichier img = new File(srcImageFile);
            Image src = ImageIO.read(img);
            int wideth = src.getWidth(null);
             int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(wideth, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D g = image.createGraphics();
            g.drawImage(src, 0, 0, largeur, hauteur, nul) ;
            // 水印文件
            Image src_biao = ImageIO.read(new File(pressImg));
            int wideth_biao = src_biao.getWidth(null);
            int hauteur_biao = src_biao.getHeight(null) ;
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                   alpha));
            g.drawImage(src_biao, (wideth -wideth_biao) 2,
                    (hauteur - hauteur_biao) / 2 , wideth_biao, height_biao, null);
            // 水印文件结束
            g.dispose();
            ImageIO.write((BufferedImage) image,  "JPEG", new File(destImageFile));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
* Calculer la longueur du texte (un caractère chinois compte pour deux caractères)
* @param text
* @return
*/
    public final static int getLength(String text ) {
        int longueur = 0;
        pour (int i = 0; je &Lt ; texte.longueur(); i++) {
            if (new String(text.charAt(i) + "").getBytes().length > 1) {
                length += 2;
             } else {
                length += 1;
            }
        }
        longueur de retour / 2;
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn