java 图像IO (二)
2014-04-01 19:38
155 查看
/*****************************************************
* 旋转图片
*
* @param buffimg
* @param radians
* @return file
****************************************************/
public static File rotateImage(String filename, int angle) {
File file = new File(filename);
BufferedImage buffimg = null;
try {
buffimg = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
int w = buffimg.getWidth();
int h = buffimg.getHeight();
//目标图片
BufferedImage tempimg = null;
Graphics2D graphics2d = null;
int type = buffimg.getColorModel().getTransparency();
if(angle%360==0){
return file;
}else if(angle%180==0){
//图片形状不变
tempimg = new BufferedImage(w, h, type);
graphics2d = tempimg.createGraphics();
//Math.toRadians(angle), w / 2, h / 2, 三参数中,前者为角度,后两者为原图片左上角移动后的对齐点
graphics2d.rotate(Math.toRadians(angle), w / 2, h / 2);
}
else if(angle % 90 ==0) {
//图片形状变了
tempimg = new BufferedImage(h, w, type);
graphics2d = tempimg.createGraphics();
//使之顺时针为-,逆时针为+
angle=-angle;
//Math.toRadians(angle),x,y, 前者为角度,后两者为原图片 移动后的对齐点
if(angle<0)//顺时针旋转-90(h/2,h/2)
graphics2d.rotate(Math.toRadians(angle), w/ 2, w / 2);
else//逆时针旋转+90(w/2,w/2)
graphics2d.rotate(Math.toRadians(angle), h / 2, h / 2);
}
else{
System.out.println("Can't handle this angel! ");
return file;
}
//把buffimg写到目标图片中去
graphics2d.drawImage(buffimg, 0, 0, null);
graphics2d.dispose();
buffimg = tempimg; // 让用于显示的缓冲区图像指向过滤后的图像
try {
ImageIO.write(buffimg, getsuffix(filename), file);
} catch (IOException e) {
e.printStackTrace();
}
buffimg.flush();
return file;
}
/*****************************************************************
*简单转化(不改变图像的像素深度和压缩方式)
***************************************************************/
public class ImageIOTest {
public static void main(String args[]) throws IOException {
File inputFile = new File("c://11.jpg");
BufferedImage input = ImageIO.read(inputFile);
File outputFile = new File("c://test.jpg");
ImageIO.write(input, "JPG", outputFile);
outputFile = new File("c://test.png");
ImageIO.write(input, "PNG", outputFile);
}
}
其中支持的文件格式有
import javax.imageio.*;
import java.util.Arrays;
public class GetFormats {
public static void main(String args[]) {
System.out.println("MIMETypes:")
String readFormats[] = ImageIO.getReaderMIMETypes();
String writeFormats[] =ImageIO.getWriterMIMETypes();
System.out.println("Readers: " + Arrays.asList(readFormats));
System.out.println("Writers: " + Arrays.asList(writeFormats));
System.out.println();
System.out.println("FileSuffixes:")
String readFormats[] = ImageIO.getReaderFileSuffixes();
String writeFormats[] = ImageIO.getWriterFileSuffixes();
System.out.println("Readers: " + Arrays.asList(readFormats));
System.out.println("Writers: " + Arrays.asList(writeFormats));
System.out.println();
System.out.println("FormatNames:")
String readFormats[] = ImageIO.getReaderFormatNames();
String writeFormats[] = ImageIO.getWriterFormatNames();
System.out.println("Readers: " + Arrays.asList(readFormats));
System.out.println("Writers: " + Arrays.asList(writeFormats));
}
}
MIMETypes:
Readers: [image/png, image/jpeg, image/x-png, image/vnd.wap.wbmp, image/bmp, image/gif]
Writers: [image/jpeg, image/png, image/x-png, image/vnd.wap.wbmp, image/gif, image/bmp]
FileSuffixes:
Readers: [bmp, jpg, wbmp, jpeg, png, gif]
Writers: [bmp, jpg, jpeg, wbmp, png, gif]
FormatNames:
Readers: [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
Writers: [BMP, bmp, jpg, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif]
/********************************************************************
* 翻转图像
*
* @param buffimg
* @param flag
* @return file
*******************************************************************/
public static File reverseImage(String filename, int flag) {
File file = new File(filename);
BufferedImage buffimg = null;
try {
buffimg = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
int w = buffimg.getWidth();
int h = buffimg.getHeight();
// 水平翻转图像
if (flag == HORIZIONALREVERSAL) {
// 利用几何移动类操作,坐标更换实现翻转
AffineTransform transform = new AffineTransform(-1, 0, 0, 1, w, 0);
AffineTransformOp op = new AffineTransformOp(transform, null);
BufferedImage tempimg = op.filter(buffimg, null);
buffimg = tempimg;
} else
// 垂直翻转图像
if (flag == VERTICALREVERSAL) {
AffineTransform transform = new AffineTransform(1, 0, 0, -1, 0, h);
AffineTransformOp op = new AffineTransformOp(transform, null);
BufferedImage tempimg = op.filter(buffimg, null);
buffimg = tempimg;
} else
System.out.println("param err!");
// 写回源文件
try {
ImageIO.write(buffimg, getsuffix(filename), file);
} catch (IOException e) {
e.printStackTrace();
}
buffimg.flush();
return file;
}
/**********************
* 剪切图片
*
* @param bufimg
* @param startx
* @param starty
* @param endx
* @param endy
* @return
*********************/
public static BufferedImage cutpic(BufferedImage bufimg, int startx,
int starty, int endx, int endy) {
bufimg = bufimg.getSubimage(startx, starty, endx, endy);
return bufimg;
}
/********************************
* 缩放图片
*
* @param buffimg
* @param width
* @param height
* @param hints
* @return
************************/
public static BufferedImage scanPic(BufferedImage buffimg, int width,
int height) {
Image image = buffimg.getScaledInstance(width, height,
Image.SCALE_DEFAULT);
// BufferedImage与Image转换
BufferedImage temp = new BufferedImage(width, height, buffimg.getType());
Graphics g = temp.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
buffimg = temp;
return buffimg;
}
/******************
* 反色显示图像
*
* @param file
* @return
*****************/
public static BufferedImage invertcolor(BufferedImage buffimg) {
WritableRaster wr = null;
int[] bitmap = null;
//修改图片
wr = buffimg.getRaster();
bitmap=wr.getPixels(0, 0, wr.getWidth(), wr.getHeight(), (int[]) null);
//反色
if (bitmap != null) {
//System.out.println("not null");//调试语句
for (int i = 0; i < bitmap.length; i++)
bitmap[i] = ~bitmap[i];
wr.setPixels(0, 0, wr.getWidth(), wr.getHeight(), bitmap);
}
//写回图片
buffimg=new BufferedImage(buffimg.getColorModel(),wr,false,null);
return buffimg;
}
/**************************
* 判断是否是bmp单色图
*
* @param buffimg
* @return
************************/
public static boolean isbmp2pic(BufferedImage buffimg) {
boolean yes = false;
final int fhofferset = 0;// 文件头偏移位置
final int infofferser = 14;// 信息头偏移位置
byte[] databyte = null;
// BufferedImage 转为byte[]
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(buffimg, "bmp", out);
} catch (IOException e) {
e.printStackTrace();
}
databyte = out.toByteArray();
// 获取图形格式标志位
String formflag = "" + (char) databyte[0 + fhofferset]
+ (char) databyte[1 + fhofferset];
// 获取每个像数的位数,该数据在信息头
int pixsize = ((databyte[15 + infofferser] & 0xff) << 8)
| databyte[14 + infofferser] & 0xff;
// System.out.println("The bits per pixe is:"+pixsize);//调试语句
// 判断是否是bmp单色图
if (formflag.equals("BM") && pixsize == 1)
yes = true;
return yes;
}
/**
* 彩色转为黑白,深度不变
* @param source
* @param result
*/
public static void gray(String source, String result)
{
try
{
BufferedImage src = ImageIO.read(new File(source));
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
src = op.filter(src, null);
ImageIO.write(src, "JPEG", new File(result));
}
catch (IOException e)
{
e.printStackTrace();
}
}
/******************************
* 转换为bmp2色黑白图片
*
* @param filename
* @return file
*/
public static RenderedImage convert2bmp(String filename) {
File file = new File(filename);
BufferedImage colimg = null;
try {
colimg = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
//首先将彩色图片转化为灰度图片
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
BufferedImage grayimg = op.filter(colimg, null);
//转为单色1bit图片
Histogram histogram =(Histogram)JAI.create("histogram", grayimg).getProperty("histogram");
double[] threshold = histogram.getPTileThreshold(0.4); //改变域值可以得到不同效果
//RenderedImage bwimg =
// JAI.create("binarize", grayimg, new Double(threshold[0]));//还可以使用Dithere替换binarize
RenderedImage bwimg =
JAI.create("dithere", grayimg, new Double(threshold[0]));
grayimg.flush();
//写回文件
try {
ImageIO.write(bwimg, "bmp", file);
} catch (IOException e) {
e.printStackTrace();
}
file.renameTo(new File(getprefix(filename)+".bmp"));
return bwimg;
}
* 旋转图片
*
* @param buffimg
* @param radians
* @return file
****************************************************/
public static File rotateImage(String filename, int angle) {
File file = new File(filename);
BufferedImage buffimg = null;
try {
buffimg = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
int w = buffimg.getWidth();
int h = buffimg.getHeight();
//目标图片
BufferedImage tempimg = null;
Graphics2D graphics2d = null;
int type = buffimg.getColorModel().getTransparency();
if(angle%360==0){
return file;
}else if(angle%180==0){
//图片形状不变
tempimg = new BufferedImage(w, h, type);
graphics2d = tempimg.createGraphics();
//Math.toRadians(angle), w / 2, h / 2, 三参数中,前者为角度,后两者为原图片左上角移动后的对齐点
graphics2d.rotate(Math.toRadians(angle), w / 2, h / 2);
}
else if(angle % 90 ==0) {
//图片形状变了
tempimg = new BufferedImage(h, w, type);
graphics2d = tempimg.createGraphics();
//使之顺时针为-,逆时针为+
angle=-angle;
//Math.toRadians(angle),x,y, 前者为角度,后两者为原图片 移动后的对齐点
if(angle<0)//顺时针旋转-90(h/2,h/2)
graphics2d.rotate(Math.toRadians(angle), w/ 2, w / 2);
else//逆时针旋转+90(w/2,w/2)
graphics2d.rotate(Math.toRadians(angle), h / 2, h / 2);
}
else{
System.out.println("Can't handle this angel! ");
return file;
}
//把buffimg写到目标图片中去
graphics2d.drawImage(buffimg, 0, 0, null);
graphics2d.dispose();
buffimg = tempimg; // 让用于显示的缓冲区图像指向过滤后的图像
try {
ImageIO.write(buffimg, getsuffix(filename), file);
} catch (IOException e) {
e.printStackTrace();
}
buffimg.flush();
return file;
}
/*****************************************************************
*简单转化(不改变图像的像素深度和压缩方式)
***************************************************************/
public class ImageIOTest {
public static void main(String args[]) throws IOException {
File inputFile = new File("c://11.jpg");
BufferedImage input = ImageIO.read(inputFile);
File outputFile = new File("c://test.jpg");
ImageIO.write(input, "JPG", outputFile);
outputFile = new File("c://test.png");
ImageIO.write(input, "PNG", outputFile);
}
}
其中支持的文件格式有
import javax.imageio.*;
import java.util.Arrays;
public class GetFormats {
public static void main(String args[]) {
System.out.println("MIMETypes:")
String readFormats[] = ImageIO.getReaderMIMETypes();
String writeFormats[] =ImageIO.getWriterMIMETypes();
System.out.println("Readers: " + Arrays.asList(readFormats));
System.out.println("Writers: " + Arrays.asList(writeFormats));
System.out.println();
System.out.println("FileSuffixes:")
String readFormats[] = ImageIO.getReaderFileSuffixes();
String writeFormats[] = ImageIO.getWriterFileSuffixes();
System.out.println("Readers: " + Arrays.asList(readFormats));
System.out.println("Writers: " + Arrays.asList(writeFormats));
System.out.println();
System.out.println("FormatNames:")
String readFormats[] = ImageIO.getReaderFormatNames();
String writeFormats[] = ImageIO.getWriterFormatNames();
System.out.println("Readers: " + Arrays.asList(readFormats));
System.out.println("Writers: " + Arrays.asList(writeFormats));
}
}
MIMETypes:
Readers: [image/png, image/jpeg, image/x-png, image/vnd.wap.wbmp, image/bmp, image/gif]
Writers: [image/jpeg, image/png, image/x-png, image/vnd.wap.wbmp, image/gif, image/bmp]
FileSuffixes:
Readers: [bmp, jpg, wbmp, jpeg, png, gif]
Writers: [bmp, jpg, jpeg, wbmp, png, gif]
FormatNames:
Readers: [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
Writers: [BMP, bmp, jpg, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif]
/********************************************************************
* 翻转图像
*
* @param buffimg
* @param flag
* @return file
*******************************************************************/
public static File reverseImage(String filename, int flag) {
File file = new File(filename);
BufferedImage buffimg = null;
try {
buffimg = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
int w = buffimg.getWidth();
int h = buffimg.getHeight();
// 水平翻转图像
if (flag == HORIZIONALREVERSAL) {
// 利用几何移动类操作,坐标更换实现翻转
AffineTransform transform = new AffineTransform(-1, 0, 0, 1, w, 0);
AffineTransformOp op = new AffineTransformOp(transform, null);
BufferedImage tempimg = op.filter(buffimg, null);
buffimg = tempimg;
} else
// 垂直翻转图像
if (flag == VERTICALREVERSAL) {
AffineTransform transform = new AffineTransform(1, 0, 0, -1, 0, h);
AffineTransformOp op = new AffineTransformOp(transform, null);
BufferedImage tempimg = op.filter(buffimg, null);
buffimg = tempimg;
} else
System.out.println("param err!");
// 写回源文件
try {
ImageIO.write(buffimg, getsuffix(filename), file);
} catch (IOException e) {
e.printStackTrace();
}
buffimg.flush();
return file;
}
/**********************
* 剪切图片
*
* @param bufimg
* @param startx
* @param starty
* @param endx
* @param endy
* @return
*********************/
public static BufferedImage cutpic(BufferedImage bufimg, int startx,
int starty, int endx, int endy) {
bufimg = bufimg.getSubimage(startx, starty, endx, endy);
return bufimg;
}
/********************************
* 缩放图片
*
* @param buffimg
* @param width
* @param height
* @param hints
* @return
************************/
public static BufferedImage scanPic(BufferedImage buffimg, int width,
int height) {
Image image = buffimg.getScaledInstance(width, height,
Image.SCALE_DEFAULT);
// BufferedImage与Image转换
BufferedImage temp = new BufferedImage(width, height, buffimg.getType());
Graphics g = temp.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
buffimg = temp;
return buffimg;
}
/******************
* 反色显示图像
*
* @param file
* @return
*****************/
public static BufferedImage invertcolor(BufferedImage buffimg) {
WritableRaster wr = null;
int[] bitmap = null;
//修改图片
wr = buffimg.getRaster();
bitmap=wr.getPixels(0, 0, wr.getWidth(), wr.getHeight(), (int[]) null);
//反色
if (bitmap != null) {
//System.out.println("not null");//调试语句
for (int i = 0; i < bitmap.length; i++)
bitmap[i] = ~bitmap[i];
wr.setPixels(0, 0, wr.getWidth(), wr.getHeight(), bitmap);
}
//写回图片
buffimg=new BufferedImage(buffimg.getColorModel(),wr,false,null);
return buffimg;
}
/**************************
* 判断是否是bmp单色图
*
* @param buffimg
* @return
************************/
public static boolean isbmp2pic(BufferedImage buffimg) {
boolean yes = false;
final int fhofferset = 0;// 文件头偏移位置
final int infofferser = 14;// 信息头偏移位置
byte[] databyte = null;
// BufferedImage 转为byte[]
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(buffimg, "bmp", out);
} catch (IOException e) {
e.printStackTrace();
}
databyte = out.toByteArray();
// 获取图形格式标志位
String formflag = "" + (char) databyte[0 + fhofferset]
+ (char) databyte[1 + fhofferset];
// 获取每个像数的位数,该数据在信息头
int pixsize = ((databyte[15 + infofferser] & 0xff) << 8)
| databyte[14 + infofferser] & 0xff;
// System.out.println("The bits per pixe is:"+pixsize);//调试语句
// 判断是否是bmp单色图
if (formflag.equals("BM") && pixsize == 1)
yes = true;
return yes;
}
/**
* 彩色转为黑白,深度不变
* @param source
* @param result
*/
public static void gray(String source, String result)
{
try
{
BufferedImage src = ImageIO.read(new File(source));
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
src = op.filter(src, null);
ImageIO.write(src, "JPEG", new File(result));
}
catch (IOException e)
{
e.printStackTrace();
}
}
/******************************
* 转换为bmp2色黑白图片
*
* @param filename
* @return file
*/
public static RenderedImage convert2bmp(String filename) {
File file = new File(filename);
BufferedImage colimg = null;
try {
colimg = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
//首先将彩色图片转化为灰度图片
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
BufferedImage grayimg = op.filter(colimg, null);
//转为单色1bit图片
Histogram histogram =(Histogram)JAI.create("histogram", grayimg).getProperty("histogram");
double[] threshold = histogram.getPTileThreshold(0.4); //改变域值可以得到不同效果
//RenderedImage bwimg =
// JAI.create("binarize", grayimg, new Double(threshold[0]));//还可以使用Dithere替换binarize
RenderedImage bwimg =
JAI.create("dithere", grayimg, new Double(threshold[0]));
grayimg.flush();
//写回文件
try {
ImageIO.write(bwimg, "bmp", file);
} catch (IOException e) {
e.printStackTrace();
}
file.renameTo(new File(getprefix(filename)+".bmp"));
return bwimg;
}
相关文章推荐
- java图像界面开发简单实例-ImageIO、JFileChooser、JMenu、JPanel的应用
- java 图像IO
- java ImageIO处理图像的封装
- java数字图像处理基础使用imageio写图像文件示例
- java 图像IO (三)
- opencv3_java 摄像头图形图像检测DetectObjectsCamera videoioVideoCapture
- java数字图像处理基础使用imageio写图像文件示例(转载)
- java : 调用ImageIO.writer从BufferedImage生成jpeg图像的坑
- java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决
- java 图像IO
- java 图像IO (二)
- java ImageIO处理图像的封装
- java 图像IO (三)
- java ImageIO处理图像的封装
- java基础之IO操作
- iOS-Core-Animation之十四----图像IO
- java IO实现电脑搜索、删除功能的实例
- java各种IO读取文件对比
- JAVA基础知识:IO
- Java中Commons-io-jar包中的方法、合并流、线程