java图片黑白_ImagesUtil java图片操作 缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水...

package com.wiiy.jtb.util;

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.RenderingHints;

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;

public class ImageUtils {

public static String

IMAGE_TYPE_GIF = "gif"; // 图形交换格式

public static String

IMAGE_TYPE_JPG = "jpg"; // 联合照片专家组

public static String

IMAGE_TYPE_JPEG = "jpeg"; // 联合照片专家组

public static String

IMAGE_TYPE_BMP = "bmp"; //

英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式

public static String

IMAGE_TYPE_PNG = "png"; // 可移植网络图形

public static String

IMAGE_TYPE_PSD = "psd"; // Photoshop的专用格式Photoshop

public static String

path1="d:/test.jpg";

public static String

path2="d:/scale.jpg";

public static void

main(String[] args) {

// 1-缩放图像:

// 方法一:按比例缩放

//ImageUtils.scale(path1, path2, 2, false);//

false  缩小  true

放大

// 方法二:按高度和宽度缩放

//ImageUtils.scale2(path1,path2, 500, 300,

true);//测试OK

// 2-旋转图像:

//方法一:旋转图像

//ImageUtils.rotate(path1, path2, 120);

//水平翻转图像

//ImageUtils.flip(path1, path2);

// 3-切割图像:

// 方法一:按指定起点坐标和宽高切割

//ImageUtils.cut(path1, path2,

0, 0, 150, 200

);//测试OK

// 方法二:指定切片的行数和列数

//ImageUtils.cut2(path1, path2, 8, 8

);//测试OK

// 方法三:指定切片的宽度和高度

//ImageUtils.cut3(path1, path2, 100, 100

);//测试OK

// 4-图像类型转换:

//ImageUtils.convert("e:/abc.jpg", "GIF",

"e:/abc_convert.gif");//测试OK

// 5-彩色转黑白:

//ImageUtils.gray("e:/abc.jpg",

"e:/abc_gray.jpg");//测试OK

// 6-给图片添加文字水印:

// 方法一:

//ImageUtils.pressText("我是水印文字","e:/abc.jpg","e:/abc_pressText.jpg","宋体",Font.BOLD,Color.white,80,

0, 0, 0.5f);//测试OK

// 方法二:

//ImageUtils.pressText2("我也是水印文字",

"e:/abc.jpg","e:/abc_pressText2.jpg", "黑体", 36, Color.white, 80, 0,

0, 0.5f);//测试OK

// 7-给图片添加图片水印:

//ImageUtils.pressImage("e:/abc2.jpg",

"e:/abc.jpg","e:/abc_pressImage.jpg", 0, 0, 0.5f);//测试OK

}

public final static void

scale(String srcImageFile, String result,int scale, boolean flag)

{

try {

BufferedImage src = ImageIO.read(new File(srcImageFile)); //

读入文件

int width

= src.getWidth(); // 得到源图宽

int height

= src.getHeight(); // 得到源图长

if (flag)

{ // 放大

width = width * scale;

height = height *

scale;

} else {

// 缩小

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); // 绘制缩小后的图

g.dispose();

ImageIO.write(tag, "JPEG", new File(result));// 输出到文件流

} catch (IOException e) {

e.printStackTrace();

}

}

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,(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();

}

}

public static

BufferedImage rotateImage(BufferedImage bufferedimage, int

degree){

int w= bufferedimage.getWidth();// 得到图片宽度。

int h= bufferedimage.getHeight();//

得到图片高度。

int type=

bufferedimage.getColorModel().getTransparency();// 得到图片透明度。

BufferedImage img;// 空的图片。

Graphics2D graphics2d;// 空的画笔。

(graphics2d=(img=new

BufferedImage(w,h,type)).createGraphics()).setRenderingHint(

RenderingHints.KEY_INTERPOLATION,

RenderingHints.VALUE_INTERPOLATION_BILINEAR);

graphics2d.rotate(Math.toRadians(degree), w / 2,

h / 2);// 旋转,degree是整型,度数,比如垂直90度。

graphics2d.drawImage(bufferedimage, 0, 0,

null);// 从bufferedimagecopy图片至img,0,0是img的坐标。

graphics2d.dispose();

return img;//

返回复制好的图片,原图片依然没有变,没有旋转,下次还可以使用。

}

public static

BufferedImage flipImage(BufferedImage bufferedimage){

int w = bufferedimage.getWidth();// 得到宽度。

int h = bufferedimage.getHeight();// 得到高度。

BufferedImage img;// 空图片。

Graphics2D graphics2d;// 空画笔。

(graphics2d=(

img = new

BufferedImage(w,h,bufferedimage.getColorModel().getTransparency())

).createGraphics()

).drawImage(bufferedimage, 0, 0, w, h, w, 0, 0,

h, null);

graphics2d.dispose();

return img;

}

public final static void

rotate(String srcImageFile, String result,int num) {

try {

BufferedImage src = ImageIO.read(new File(srcImageFile)); //

读入文件

src=rotateImage(src, num);

Image

image = src.getScaledInstance(src.getWidth(),

src.getHeight(),Image.SCALE_DEFAULT);

BufferedImage tag = new BufferedImage(src.getWidth(),

src.getHeight(),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();

}

}

public final static void

flip(String srcImageFile, String result) {

try {

BufferedImage src = ImageIO.read(new File(srcImageFile)); //

读入文件

src=flipImage(src);

Image

image = src.getScaledInstance(src.getWidth(),

src.getHeight(),Image.SCALE_DEFAULT);

BufferedImage tag = new BufferedImage(src.getWidth(),

src.getHeight(),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();

}

}

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

srcWidth = bi.getHeight(); // 源图宽度

int

srcHeight = bi.getWidth(); // 源图高度

if

(srcWidth > 0 && srcHeight > 0) {

Image image =

bi.getScaledInstance(srcWidth, srcHeight,

Image.SCALE_DEFAULT);

// 四个参数分别为图像起点坐标和宽高

// 即: 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); // 绘制切割后的图

g.dispose();

// 输出为文件

ImageIO.write(tag, "JPEG",

new File(result));

}

} catch (Exception e) {

e.printStackTrace();

}

}

public final static void

cut2(String srcImageFile, String descDir,

int rows,

int cols) {

try {

if(rows<=0||rows>20) rows = 2; // 切片行数

if(cols<=0||cols>20) cols = 2; // 切片列数

//

读取源图像

BufferedImage bi = ImageIO.read(new File(srcImageFile));

int

srcWidth = bi.getHeight(); // 源图宽度

int

srcHeight = bi.getWidth(); // 源图高度

if

(srcWidth > 0 && srcHeight > 0) {

Image img;

ImageFilter cropFilter;

Image image =

bi.getScaledInstance(srcWidth, srcHeight,

Image.SCALE_DEFAULT);

int destWidth = srcWidth; //

每张切片的宽度

int destHeight = srcHeight;

// 每张切片的高度

// 计算切片的宽度和高度

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;

}

// 循环建立切片

// 改进的想法:是否可用多线程加快切割速度

for (int i = 0; i < rows;

i++) {

for (int j = 0; j < cols; j++) {

//

四个参数分别为图像起点坐标和宽高

// 即:

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); // 绘制缩小后的图

g.dispose();

//

输出为文件

ImageIO.write(tag, "JPEG", new File(descDir+ "_r" + i + "_c" + j +

".jpg"));

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

public final static void

cut3(String srcImageFile, String descDir,

int

destWidth, int destHeight) {

try {

if(destWidth<=0) destWidth = 200; // 切片宽度

if(destHeight<=0) destHeight = 150; // 切片高度

//

读取源图像

BufferedImage bi = ImageIO.read(new File(srcImageFile));

int

srcWidth = bi.getHeight(); // 源图宽度

int

srcHeight = bi.getWidth(); // 源图高度

if

(srcWidth > destWidth && srcHeight > destHeight)

{

Image img;

ImageFilter cropFilter;

Image image =

bi.getScaledInstance(srcWidth, srcHeight,

Image.SCALE_DEFAULT);

int cols = 0; // 切片横向数量

int rows = 0; // 切片纵向数量

// 计算切片的横向和纵向数量

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;

}

// 循环建立切片

// 改进的想法:是否可用多线程加快切割速度

for (int i = 0; i < rows;

i++) {

for (int j = 0; j < cols; j++) {

//

四个参数分别为图像起点坐标和宽高

// 即:

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); // 绘制缩小后的图

g.dispose();

//

输出为文件

ImageIO.write(tag, "JPEG", new File(descDir

+ "_r" + i + "_c" + j + ".jpg"));

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

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();

}

}

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();

}

}

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));

//

在指定坐标绘制水印文字

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();

}

}

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));

//

在指定坐标绘制水印文字

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();

}

}

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);

//

水印文件

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);

//

水印文件结束

g.dispose();

ImageIO.write((BufferedImage) image,  "JPEG", new

File(destImageFile));

} catch (Exception e) {

e.printStackTrace();

}

}

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值