Import Java.awt.AlphaComposite;
Import Java.awt.Color;
Import Java.awt.Font;
Import Java.awt.Graphics;
Import Java.awt.Graphics2D;
Import Java.awt.Image;
Import Java.awt.Toolkit;
Import Java.awt.color.ColorSpace;
Import Java.awt.geom.AffineTransform;
Import java.awt.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;
/**
* Picture processing Tool class:<br>
* Function: Zoom image, cut image, image type conversion, color turn black and white, text watermark, image watermark, etc.
* @author Administrator
*/
public class Imageutils {
/**
* Several common picture formats
*/
public static string image_type_gif = "GIF";//Graphics Interchange Format
public static string image_type_jpg = " JPG//Joint photo Expert Group
public static String image_type_jpeg = "JPEG";//Joint Photographic expert Group
public static String image_type_bmp = "BMP" or shorthand for the English bitmap (bitmap), which is the standard image file format in the Windows operating system
public static string image_type_png = "PNG";/Portable Network Graphics
public static string image_type_psd = "PSD";//Photo Shop's special format Photoshop
/**
* Program entry: For testing
* @param args
*/
public static void Main (string[] args) {
//1-Zoom Image:
//Method One: Scaling by scale
Imageutils.scale ("E:/abc.jpg", "E:/abc_scale.jpg", 2, true);//test OK
/Method Two: Scale by height and width
imageutils.scale2 ("E :/abc.jpg "," e:/abc_scale2.jpg ", +, true);/test OK
2-Cut Image:
Method One: According to the specified starting point coordinates and wide-height cutting
Imageutils.cut ("E:/abc.jpg", "E:/abc_cut.jpg", 0, 0, 400, 400);//test OK
Method Two: Specify the number of rows and columns for the slice
Imageutils.cut2 ("E:/abc.jpg", "e:/", 2, 2);//test OK
Method Three: Specify the width and height of the slice
IMAGEUTILS.CUT3 ("E:/abc.jpg", "e:/", 300, 300);//test OK
Image type conversion:
Imageutils.convert ("E:/abc.jpg", "GIF", "e:/abc_convert.gif");//test OK
4-color Turn black and white:
Imageutils.gray ("E:/abc.jpg", "e:/abc_gray.jpg");//test OK
5-Add a text watermark to the picture:
Method One:
Imageutils.presstext ("I am watermark text", "E:/abc.jpg", "e:/abc_presstext.jpg", "XXFarEastFont-Arial", font.bold,color.white,80, 0, 0, 0.5f); Test OK
Method Two:
IMAGEUTILS.PRESSTEXT2 ("I also watermark text", "E:/abc.jpg", "e:/abc_presstext2.jpg", "blackbody", "Color.White", "0, 0, 0.5f");//test OK
6-Add a picture watermark to the picture:
Imageutils.pressimage ("E:/abc2.jpg", "e:/abc.jpg", "E:/abc_pressimage.jpg", 0, 0, 0.5f);//test OK
}
/**
* Zoom image (scaled proportionally)
* @param srcimagefile source image file Address
* @param result scaled image address
* @param scale scaling ratio
* @param flag Zoom selection: true amplification; False narrowing;
*/
Public final static void scale (string srcimagefile, string result,
int scale, Boolean flag) {
try {
BufferedImage src = imageio.read (new File (Srcimagefile)); Read into file
int width = src.getwidth (); Get Source image width
int height = src.getheight (); Get source Diagram length
if (flag) {//Zoom in
width = width * scale;
Height = height * scale;
else {//Zoom Out
width = Width/scale;
Height = Height/scale;
}
Image image = Src.getscaledinstance (width, height,
Image.scale_default);
BufferedImage tag = new BufferedImage (width, height,
BUFFEREDIMAGE.TYPE_INT_RGB);
Graphics g = tag.getgraphics ();
G.drawimage (image, 0, 0, NULL); Draw a smaller figure
G.dispose ();
Imageio.write (Tag, "JPEG", new file (result));//output to file stream
catch (IOException e) {
E.printstacktrace ();
}
}
/**
* Zoom image (zoom by height and width)
* @param srcimagefile source image file Address
* @param result scaled image address
* @param height after height scaling
* Width of the scale after @param width
* @param BB ratio is not the need for filler: true for filler; False is not filler;
*/
Public final static void Scale2 (string srcimagefile, string result, int height, int width, Boolean bb) {
try {
Double ratio = 0.0; Scaling ratio
File F = new file (srcimagefile);
BufferedImage bi = imageio.read (f);
Image itemp = bi.getscaledinstance (width, height, bi.) Scale_smooth);
Calculation ratio
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) {//Filler
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),
Color.White, NULL);
Else
G.drawimage (Itemp, (Width-itemp.getwidth (NULL))/2, 0,
Itemp.getwidth (NULL), itemp.getheight (null),
Color.White, NULL);
G.dispose ();
itemp = image;
}
Imageio.write ((bufferedimage) itemp, "JPEG", new File (result));
catch (IOException e) {
E.printstacktrace ();
}
}
/**
* Image cutting (according to the specified starting point coordinates and wide-high cutting)
* @param srcimagefile Source image Address
* @param the image address after result slicing
* @param x Target slice start coordinates x
* @param y target slice start coordinates y
* @param width of the target slice
* @param height of target slice
*/
Public final static void cut (String srcimagefile, string result,
int x, int y, int width, int height) {
try {
Reading source Images
BufferedImage bi = imageio.read (new File (Srcimagefile));
int srcwidth = Bi.getheight (); Source Chart Width
int srcheight = Bi.getwidth (); Source Diagram Height
if (srcwidth > 0 && srcheight > 0) {
Image image = Bi.getscaledinstance (Srcwidth, Srcheight,
Image.scale_default);
The four parameters are image starting coordinates and width-height respectively.
That is: cropimagefilter (int x,int y,int width,int height)
ImageFilter cropfilter = new CropImageFilter (x, y, width, height);
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); Draw the cut figure after
G.dispose ();
Output as File
Imageio.write (Tag, "JPEG", new File (result));
}
catch (Exception e) {
E.printstacktrace ();
}
}
/**
* Image Cutting (Specify the number of rows and columns of the slice)
* @param srcimagefile Source image Address
* @param descdir Slice destination Folder
* @param row number of rows target slices. Default 2, must be within range [1, 20]
* @param cols The number of target slice columns. Default 2, must be within range [1, 20]
*/
Public final static void Cut2 (String srcimagefile, String Descdir,
int rows, int cols) {
try {
if (rows<=0| | ROWS>20) rows = 2; Slices of rows
if (cols<=0| | COLS>20) cols = 2; Number of slice columns
Reading source Images
BufferedImage bi = imageio.read (new File (Srcimagefile));
int srcwidth = Bi.getheight (); Source Chart Width
int srcheight = Bi.getwidth (); Source Diagram Height
if (srcwidth > 0 && srcheight > 0) {
Image img;
ImageFilter Cropfilter;
Image image = Bi.getscaledinstance (Srcwidth, Srcheight, Image.scale_default);
int destwidth = Srcwidth; width of each slice
int destheight = Srcheight; The height of each slice
Calculate the width and height of slices
if (srcwidth% cols = = 0) {
Destwidth = Srcwidth/cols;
} else {
Destwidth = (int) Math.floor (srcwidth/cols) + 1;
}
if (srcheight% rows = = 0) {
Destheight = srcheight/rows;
} else {
Destheight = (int) Math.floor (srcwidth/rows) + 1;
}
Looping to create slices
Improved idea: Whether multithreading can speed up the cutting speed
for (int i = 0; i < rows; i++) {
for (int j = 0; J < cols; J + +) {
The four parameters are image starting coordinates and width-height respectively.
That is: cropimagefilter (int x,int y,int width,int height)
Cropfilter = new CropImageFilter (J * destwidth, I * destheight,
Destwidth, Destheight);
img = Toolkit.getdefaulttoolkit (). CreateImage (
New FilteredImageSource (Image.getsource (),
Cropfilter));
BufferedImage tag = new BufferedImage (Destwidth,
Destheight, Bufferedimage.type_int_rgb);
Graphics g = tag.getgraphics ();
G.drawimage (IMG, 0, 0, NULL); Draw a smaller figure
G.dispose ();
Output as File
Imageio.write (Tag, "JPEG", New File (Descdir
+ "_r" + i + "_c" + j + ". jpg"));
}
}
}
catch (Exception e) {
E.printstacktrace ();
}
}
/**
* Image Cutting (Specify the width and height of the slice)
* @param srcimagefile Source image Address
* @param descdir Slice destination Folder
* @param destwidth The width of the target slice. Default 200
* @param destheight the target slice height. Default 150
*/
Public final static void Cut3 (String srcimagefile, String Descdir,
int destwidth, int destheight) {
try {
if (destwidth<=0) destwidth = 200; Slice width
if (destheight<=0) destheight = 150; Slice height
Reading source Images
BufferedImage bi = imageio.read (new File (Srcimagefile));
int srcwidth = Bi.getheight (); Source Chart Width
int srcheight = Bi.getwidth (); Source Diagram Height
if (Srcwidth > Destwidth && srcheight > Destheight) {
Image img;
ImageFilter Cropfilter;
Image image = Bi.getscaledinstance (Srcwidth, Srcheight, Image.scale_default);
int cols = 0; Slice Horizontal Quantity
int rows = 0; Slice portrait number
Calculate the horizontal and vertical number of slices
if (srcwidth% Destwidth = = 0) {
cols = Srcwidth/destwidth;
} else {
cols = (int) Math.floor (srcwidth/destwidth) + 1;
}
if (srcheight% Destheight = = 0) {
rows = srcheight/destheight;
} else {
rows = (int) Math.floor (srcheight/destheight) + 1;
}
Looping to create slices
Improved idea: Whether multithreading can speed up the cutting speed
for (int i = 0; i < rows; i++) {
for (int j = 0; J < cols; J + +) {
The four parameters are image starting coordinates and width-height respectively.
That is: cropimagefilter (int x,int y,int width,int height)
Cropfilter = new CropImageFilter (J * destwidth, I * destheight,
Destwidth, Destheight);
img = Toolkit.getdefaulttoolkit (). CreateImage (
New FilteredImageSource (Image.getsource (),
Cropfilter));
BufferedImage tag = new BufferedImage (Destwidth,
Destheight, Bufferedimage.type_int_rgb);
Graphics g = tag.getgraphics ();
G.drawimage (IMG, 0, 0, NULL); Draw a smaller figure
G.dispose ();
Output as File
Imageio.write (Tag, "JPEG", New File (Descdir
+ "_r" + i + "_c" + j + ". jpg"));
}
}
}
catch (Exception e) {
E.printstacktrace ();
}
}
/**
* Image type conversion: Gif->jpg, Gif->png, Png->jpg, Png->gif (X), bmp->png
* @param srcimagefile Source image Address
* @param formatname String containing informal names: JPG, JPEG, GIF, etc.
* @param destimagefile Target image address
*/
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 ();
}
}
/**
* Color to black and white
* @param srcimagefile Source image Address
* @param destimagefile Target image address
*/
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.write (SRC, "JPEG", New File (Destimagefile));
catch (IOException e) {
E.printstacktrace ();
}
}
/**
* Add a text watermark to the picture
* @param presstext Watermark Text
* @param srcimagefile Source image Address
* @param destimagefile Target image address
* @param the font name of the FontName watermark
* @param the font style of the FontStyle watermark
* @param the font color of a color watermark
* @param the font size of the fontsize watermark
* @param x Correction
* @param y correction positive
* @param alpha Transparency: alpha must be a floating-point number within the range [0.0, 1.0] (containing the boundary value)
*/
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 height = src.getheight (null);
BufferedImage image = new BufferedImage (width, height,
BUFFEREDIMAGE.TYPE_INT_RGB);
Graphics2D 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));
Draw watermark text at specified coordinates
g.DrawString (Presstext, (Width-getlength (presstext) * fontsize))
/2 + x, (height-fontsize)/2 + y);
G.dispose ();
Imageio.write ((bufferedimage) image, "JPEG", new File (Destimagefile));//output to file stream
catch (Exception e) {
E.printstacktrace ();
}
}
/**
* Add a text watermark to the picture
* @param presstext Watermark Text
* @param srcimagefile Source image Address
* @param destimagefile Target image address
* @param fontname Font Name
* @param fontstyle font style
* @param color font colors
* @param fontsize Font size
* @param x Correction
* @param y correction positive
* @param alpha Transparency: alpha must be a floating-point number within the range [0.0, 1.0] (containing the boundary value)
*/
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,
BUFFEREDIMAGE.TYPE_INT_RGB);
Graphics2D 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));
Draw watermark text at specified coordinates
g.DrawString (Presstext, (Width-getlength (presstext) * fontsize))
/2 + x, (height-fontsize)/2 + y);
G.dispose ();
Imageio.write ((bufferedimage) image, "JPEG", New File (Destimagefile));
catch (Exception e) {
E.printstacktrace ();
}
}
/**
* Add a picture watermark to the picture
* @param pressimg watermark Picture
* @param srcimagefile Source image Address
* @param destimagefile Target image address
* @param x Correction value. Default in the middle
* @param y correction value. Default in the middle
* @param alpha Transparency: alpha must be a floating-point number within the range [0.0, 1.0] (containing the boundary value)
*/
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 (wideth, height,
BUFFEREDIMAGE.TYPE_INT_RGB);
Graphics2D g = image.creategraphics ();
G.drawimage (SRC, 0, 0, wideth, height, null);
Watermark File
Image Src_biao = Imageio.read (new File (pressimg));
int wideth_biao = Src_biao.getwidth (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);
Watermark File End
G.dispose ();
Imageio.write ((bufferedimage) image, "JPEG", New File (Destimagefile));
catch (Exception e) {
E.printstacktrace ();
}
}
/**
* Calculate the length of text (two characters in one Chinese)
* @param text
* @return
*/
Public final static int getlength (String text) {
int length = 0;
for (int i = 0; i < text.length (); i++) {
if (New String (Text.charat (i) + ""). GetBytes (). length > 1) {
length = 2;
} else {
length = 1;
}
}
return LENGTH/2;
}
}