用了java的开源软件jimi图片处理工具,编写了一个图片转换工具类,包括了给图片打水印,给大家分享
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ImageProducer;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.sun.jimi.core.Jimi;
import com.sun.jimi.core.JimiException;
import com.sun.jimi.core.JimiWriter;
import com.sun.jimi.core.options.JPGOptions;
public class TransferPicture {
/**
* @param source
* @param dest
* @param quality
* 图片格式转换
*/
public void toJPG(String source, String type, int quality) {
//0<quality<100
if (quality < 0 || quality > 100 || (quality + "") == null || (quality + "").equals("")) {
System.out.println("quality must between ’0’ and ’100’");
System.out.println("set to DEFAULT value:’75’");
quality = 75;
}
String outfile = ConvertUtil.getFilename(source)+type;
try {
JPGOptions options = new JPGOptions();
options.setQuality(quality);
ImageProducer image = Jimi.getImageProducer(source);
JimiWriter writer = Jimi.createJimiWriter(outfile);
writer.setSource(image);
// 加入属性设置,非必要
// /*
writer.setOptions(options);
// */
writer.putImage(outfile);
} catch (JimiException je) {
System.err.println("Error: " + je);
}
}
/**
* @param source
* @param dest
* @throws JimiException
*/
public void toGIF(String source, String dest) throws JimiException {
if (dest == null || dest.trim().equals(""))
dest = source;
// 1:转换为jpg
if (!dest.toLowerCase().trim().endsWith("jpg")) {
dest += ".jpg";
}
toJPG(source, dest, 75);
BufferedImage file_in = null;
File file = new File(dest);
try {
file_in = javax.imageio.ImageIO.read(file);
} catch (Exception e) {
e.printStackTrace();
}
int end = dest.lastIndexOf(".");
file.deleteOnExit();
// output *.gif
file.renameTo(new File(dest.substring(0, end) + ".gif"));
// jpg to gif
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(dest);
e.addFrame(file_in);
e.finish();
/*
//分解GIF:
GifDecoder d = new GifDecoder();
d.read("sample.gif");
int n = d.getFrameCount();
for(int i = 0; i < n; i++) {
BufferedImage frame = d.getFrame(i); // frame i
int t = d.getDelay(i); // display duration of frame in milliseconds
// do something with frame
}
//合成GIF:
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(outputFileName);
e.setDelay(1000); // 1 frame per sec
e.addFrame(image1);
e.addFrame(image2);
e.finish();
*/
}
/**
* @param img
* @param dest
* @throws JimiException
*/
public void toTIF(Image img, String dest) throws JimiException {
if (!dest.toLowerCase().trim().endsWith("tif")) {
dest += ".tif";
System.out.println("Overriding to TIF, output file: " + dest);
}
dest = dest.substring(0, dest.lastIndexOf(".")) + ".jpg";
try{
System.out.println("toTIF encode");
JimiWriter writer = Jimi.createJimiWriter(dest);
writer.setSource(img);
dest = dest.substring(0, dest.lastIndexOf(".")) + ".tif";
writer.putImage(dest);
}catch(Exception e){e.printStackTrace();}
}
/**
* 线性改变图片尺寸(可同时改变图片格式)
* @param source
* 源文件完整路径
* @param desc
* 目标文件完整路径
* @param ins
* 放大/缩小比率
* @throws JimiException
* @throws IOException
*/
public void changeDimension(String source, String desc, double ins) throws JimiException, IOException {
String temp = desc;
File _file = null;
if (desc == null || desc.trim().equals(""))
desc = source;
if (!desc.toLowerCase().trim().endsWith("jpg")) {
temp = desc.trim() + ".jpg";
}
this.toJPG(source, temp, 75);
_file = new File(temp); // 读入文件
Image src = javax.imageio.ImageIO.read(_file); // 构造Image对象
double wideth = (double) src.getWidth(null); // 得到源图宽
double height = (double) src.getHeight(null); // 得到源图长
System.out.println("源图宽:"+wideth);
System.out.println("源图长:"+height);
/*//缩放处理
int iWideth = (int) (wideth * ins);
int iHeight = (int) (height * ins);
*/
int iWideth = 300;
int iHeight = 200;
System.out.println("现图宽:"+iWideth);
System.out.println("现图长:"+iHeight);
System.out.println("缩放参数:"+ins);
BufferedImage tag = null;
try{
tag = new BufferedImage(iWideth, iHeight,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, iWideth, iHeight, null); // 绘制缩小后的图
/*//打水印
File _filebiao = new File("test2.jpg");
Image src_biao = ImageIO.read(_filebiao);
int wideth_biao = 40;//src_biao.getWidth(null);
int height_biao = 40;//src_biao.getHeight(null);
tag.getGraphics().drawImage(src_biao,50,50,wideth_biao,height_biao,null);
*/
}catch(Exception e){e.printStackTrace();}
if (!temp.trim().equals(desc))
_file.deleteOnExit();
if (desc.toLowerCase().trim().endsWith("gif")) {
System.out.println("the type is gif!");
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(desc);
e.addFrame(tag);
e.finish();
} else if (desc.toLowerCase().trim().endsWith("tif") || desc.toLowerCase().trim().endsWith("tiff")) {
System.out.println("the type is tif!");
this.toTIF(tag, desc);
} else {
try{
System.out.println("common type!");
JimiWriter writer = Jimi.createJimiWriter(desc);
writer.setSource(tag);
writer.putImage(desc);
}catch(Exception ex){ex.printStackTrace();}
}
}
public void transpic(String infile,int iWideth, int iHeight, String type) throws JimiException, IOException {
String temp = infile;
File _file = null;
/*if (outfile == null || outfile.trim().equals(""))
outfile = infile;
if (!outfile.toLowerCase().trim().endsWith("jpg")) {
temp = outfile.trim() + ".jpg";
}*/
ConvertUtil cu = new ConvertUtil();
if(!cu.getFiletype(infile).equals("jpg")){
this.toJPG(infile, temp, 75);
}
_file = new File(temp); // 读入文件
Image src = javax.imageio.ImageIO.read(_file); // 构造Image对象
double wideth = (double) src.getWidth(null); // 得到源图宽
double height = (double) src.getHeight(null); // 得到源图长
System.out.println("源图宽:"+wideth);
System.out.println("源图长:"+height);
/*//缩放处理
int iWideth = (int) (wideth * ins);
int iHeight = (int) (height * ins);
*/
//int iWideth = 300;
//int iHeight = 200;
System.out.println("现图宽:"+iWideth);
System.out.println("现图长:"+iHeight);
String outfile = "";
BufferedImage tag = null;
try{
tag = new BufferedImage(iWideth, iHeight,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, iWideth, iHeight, null); // 绘制缩小后的图
/*//打水印
File _filebiao = new File("test2.jpg");
Image src_biao = ImageIO.read(_filebiao);
int wideth_biao = 40;//src_biao.getWidth(null);
int height_biao = 40;//src_biao.getHeight(null);
tag.getGraphics().drawImage(src_biao,50,50,wideth_biao,height_biao,null);
*/
}catch(Exception e){e.printStackTrace();}
if (!temp.trim().equals(outfile))
_file.deleteOnExit();
if (outfile.toLowerCase().trim().endsWith("gif")) {
System.out.println("the type is gif!");
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(outfile);
e.addFrame(tag);
e.finish();
} else if (outfile.toLowerCase().trim().endsWith("tif") || outfile.toLowerCase().trim().endsWith("tiff")) {
System.out.println("the type is tif!");
this.toTIF(tag, outfile);
} else {
try{
System.out.println("common type!");
JimiWriter writer = Jimi.createJimiWriter(outfile);
writer.setSource(tag);
writer.putImage(outfile);
}catch(Exception ex){ex.printStackTrace();}
}
}
public static void main(String[] args) {
String dest = "test.jpg";
String source = "test.gif";
int quality = 100;
double ins = 4;
TransferPicture tp = new TransferPicture();
try{
System.out.println("before change");
System.out.println("-------------------");
//tp.toJPG(source,dest,quality);
//tp.toGIF(source, dest);
tp.changeDimension(source, dest, ins);
System.out.println("-------------------");
System.out.println("end change");
}catch(Exception e){
e.printStackTrace();
}
}
}
分享到:
相关推荐
我们将讨论两种主要类型的水印:图片水印和文字水印,并介绍如何根据图片的缩放比例自动调整水印的大小、透明度、位置以及图像的质量。 首先,我们需要了解水印的基本概念。水印是嵌入到图像中的一种隐蔽标志,它...
功能概述:批量更改大小、批量图片压缩、批量添加水印、批量更改格式、批量增加特效等。 修订概述: 新增水印图片旋转功能。 新增图片旋转、灰色、反色、模糊、锐化、棕色、红色、绿色、蓝色、青色、品红、黄色等...
3. **WaterMarkDemo.aspx.cs**: 这是ASP.NET页面的后台代码,实现具体的业务逻辑,包括处理图片、添加水印等功能。 4. **ImageWaterMark3.0技术开发手册.doc**: 这应该是一个详细的技术文档,介绍了如何使用和开发这...
解决图片的批量处理大小,批量给图片加图片水印,加文字水印
6. **安全性与性能**:为了防止恶意用户绕过水印,应确保图片处理过程安全,例如验证上传文件类型和大小。同时,为了保证服务响应速度,优化水印添加的算法和处理流程至关重要,特别是对于高并发的场景。 7. **响应...
在本主题中,我们将探讨如何使用NDK在Android应用中实现图片处理,特别是添加文字和图片水印的功能。 首先,我们需要了解NDK的基本使用。安装NDK后,我们可以在项目的jni目录下创建C++源码文件,这些文件将包含处理...
水印是图片处理中的一个常见概念,它可以是透明或半透明的文字、图像或图形,被叠加在原图片上,既不会严重影响原图的观看体验,又能起到标识或保护作用。在易语言中,我们可以通过处理像素数据来实现水印的添加。 ...
1. 设计水印:你可以选择使用文本或者自己的logo作为水印内容。如果使用文本,可以使用`text()`函数;如果使用图像,可以先加载该图像,然后调整其透明度。 2. 设置透明度:在MATLAB中,我们可以通过调整图像的...
我自己做的图片水印处理程序希望大家喜欢哦
请注意,实际的MATLAB代码可能会有更多的细节处理,比如处理不同类型的图像格式、确保水印大小适应原图、以及优化水印位置以使其更不易被去除等。学习这个案例程序将帮助你深入理解图像处理中的这一实用技巧。
- Controller调用Model,Model使用如ImageMagick、PIL(Python Imaging Library)或System.Drawing(C#)等库进行图片处理,将水印图片叠加到源图片上。 - 处理完成后,Model返回处理后的图片数据给Controller。 ...
GDI+提供了丰富的图形绘制和处理功能,如画线、填充区域、绘制文本和图像等,非常适合处理水印需求。 添加水印文字: 1. 创建一个`Bitmap`对象,装载原始图片。 2. 使用`Graphics`对象从`Bitmap`创建一个绘图上下文...
9. **应用场景**:该软件适用于多种场合,包括但不限于个人照片保护、企业品牌推广、电商平台商品图片处理、社交媒体分享等。 10. **版本更新与技术支持**:一个持续发展的软件会定期发布更新,修复已知问题,增加...
在Java编程语言中,处理图片水印涉及到图像处理和图形绘制技术。`Graphics2D`是Java 2D API的一部分,它提供了丰富的功能,可以用来在图像上添加文本、图像等元素,实现水印效果。下面我们将深入探讨如何使用`...
- 添加图片水印: ```csharp using (var graphics = Graphics.FromImage(mainImage)) { graphics.DrawImage(watermarkImage, position, 0, 0, watermarkImage.Width, watermarkImage.Height, GraphicsUnit....
在Java编程中,添加水印是一项常见的图像处理任务,它涉及到图像处理库的使用和算法设计。...在实际应用中,还需要考虑性能优化,如批量处理大量图片时的并行化处理,以及对不同格式图像的支持等。
总之,随着个人和企业对图像质量要求的不断提高,这款集打印、剪裁和加水印等多种功能于一体的工具无疑成为了图片处理领域的一个有益补充。它不仅提供了便捷的操作流程,还确保了输出的图片具有高质量和专业性,使得...
在Delphi编程环境中,给图片添加水印是一项常见的图像处理任务。水印可以是文字、图形或透明图像,用于标识所有权、版权信息或者为图片添加视觉元素。在本项目中,我们将探讨如何使用Delphi来实现这个功能,尤其是...
2. 图形水印:可以是公司Logo、个人头像等,更具有视觉识别性,有助于品牌形象的传播。 3. 透明水印:透明度高,不明显干扰原图,但仔细观察仍能发现。 4. 非透明水印:用于强调版权,可能对图像有较明显的遮挡。 ...
以下是一个简单的例子,展示如何使用Apache Commons Imaging添加文本水印: ```java import org.apache.commons.imaging.ImageReadException; import org.apache.commons.imaging.ImageWriteException; import org....