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
// 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
ImageUtils.convert("e:/abc.jpg", "GIF", "e:/abc_convert.gif"); //Test OK
ImageUtils.gray("e:/abc.jpg", "e:/abc_gray.jpg");//Test OK
// 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!