引用
package com.lovesz.mf.util;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.Date;
import javax.imageio.ImageIO;
import org.apache.log4j.Logger;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
*
* @author
*
*/
public class ImageTool
{
public static Logger logger = Logger.getLogger(ImageTool.class);
/**
* @param file
* 需要读取的文件
* @param targetImgPath
* 要写的目标地址图片文件路径(包括图片名称 比如:83193_7484.jpg 的83193_7484部分)
* @param picFormat
* 图片格式
* @param imgWidth
* 目标图片的宽度
* @param imgHeight
* 目标图片的高度
* @return false 执行失败 true 执行成功
*/
public static boolean generateImage(File file, String targetImgPath, String picFormat, int imgWidth, int imgHeight)
throws IOException
{
logger.info("----------调用生成图片方法,产生图片开始----------");
// 读取文件,可能产生IO异常
BufferedImage sourceImg = ImageIO.read(file);
logger.info("图片宽度" + sourceImg.getWidth());
logger.info("图片高度" + sourceImg.getHeight());
logger.info("图片类型" + sourceImg.getType());
// 首先判断长宽
// 如果是长 > 宽 flag 为true 否则为FALSE
boolean flag = true;
int img_w = sourceImg.getWidth();
int img_h = sourceImg.getHeight();
// 如果长度大于等于高度则 flag = true;
if (img_w >= img_h)
{
flag = true;
logger.info("图片长度Width大于或者等于高度Height");
}
else
{
flag = false;
logger.info("图片长度Width小于高度Height");
}
File itemFile = new File("");
Float f = new Float(0);
// 长大于宽的情况下
if (flag)
{
f = ((new Float(img_h) * imgWidth) / new Float(img_w));
logger.info("新生成的图片的高度height是:" + f);
int newHeight = f.intValue() + 1;
BufferedImage image = new BufferedImage(imgWidth, newHeight, BufferedImage.TYPE_INT_RGB); // 表示一个图像,该图像具有打包成整数像素的 8 位
Graphics g = image.createGraphics();
g.drawImage(sourceImg, 0, 0, imgWidth, newHeight, null);
// 释放此图形的上下文并释放它所使用的所有系统资源。
g.dispose();
// 拼接图片路径
String targetFileName = targetImgPath + picFormat;
itemFile = new File(targetFileName);
FileOutputStream out_pre = new FileOutputStream(itemFile);
JPEGImageEncoder encoder_pre = JPEGCodec.createJPEGEncoder(out_pre);
encoder_pre.encode(image);
out_pre.flush();
out_pre.close();
}
else
{
f = ((new Float(img_w) * imgHeight) / new Float(img_h));
logger.info("新生成的图片的宽度width是:" + f);
int newWidth = f.intValue() + 1;
BufferedImage image = new BufferedImage(newWidth, imgHeight, BufferedImage.TYPE_INT_RGB); // 表示一个图像,该图像具有打包成整数像素的 8 位
Graphics g = image.createGraphics();
g.drawImage(sourceImg, 0, 0, newWidth, imgHeight, null);
// 释放此图形的上下文并释放它所使用的所有系统资源。
g.dispose();
// 写新文件的地址
// 拼接图片路径
String targetFileName = targetImgPath + picFormat;
itemFile = new File(targetFileName);
FileOutputStream out_pre = new FileOutputStream(itemFile);
JPEGImageEncoder encoder_pre = JPEGCodec.createJPEGEncoder(out_pre);
encoder_pre.encode(image);
out_pre.flush();
out_pre.close();
}
//s生成图片路径 itemFile
/**
* 下面代码的"D:\\1.jpg",是我把商品图片(需要被加水印的图片)
* 保存在D盘,并起名为1.jpg,这里您根据您的图片的实际位置来输
* 入正确的文件路径。
*/
File formerFile = new File("c:/1.jpg");
Image formerImage = ImageIO.read(formerFile); //itemFile 就是要被水印的文件
//以下2行代码分别获得图片的宽(width)和高(height)
int width = formerImage.getWidth(null); //640px
int height = formerImage.getHeight(null); //480px
System.out.println("原始图片的宽为:" + width + "\n原始图片的高为:" + height);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
g.drawImage(formerImage, 0, 0, width, height, null);
//File waterMarkFile = itemFile;
Image waterMarkImage = ImageIO.read(itemFile);
int widthWMI = waterMarkImage.getWidth(null);
int heightWMI = waterMarkImage.getHeight(null);
/**
* 以下2行代码的x,y分别表示水印图片在原始图片的位置。
* x,y为坐标。width,height为商品图片的宽和高。
* width * 0.5 表示水印图片的水平位置覆盖在商品图片
* 水平位置的正中间。height * 0.5 表示垂直位置。
* 最终无论商品图片的宽高是多少,水印图片都会显示在
* 商品图片的正中间。
* 您可以根据您的需求,更改0.5这个数值,达到您想要的效果。
* 这里我说的商品图片就是要被水印覆盖的图片。
*/
int x = (int) (640 - widthWMI) / 2; //"0.5"小数越大,水印越向左移动。
int y = (int) (480 - heightWMI) / 2; //"0.5"小数越大,水印越向上移动。
g.drawImage(waterMarkImage, width - widthWMI - x, height - heightWMI - y, widthWMI, heightWMI, null);
/**
* 输出被加上水印的图片,也就是最终的效果。
* 注意!下面代码的"D:\\1.jpg"是最后输出
* 的文件,如果跟你原始文件的路径和名字相同
* 的话,那么会覆盖掉原始文件。
* 如:我的原始文件位于"D:\\1.jpg",而下
* 面的代码运行之后,我的原始文件就会丢失被
* 覆盖掉。
* 您可以根据您的需要把加上水印后的图片放到
* 您指定的文件路径。
*/
g.dispose();
FileOutputStream out = new FileOutputStream("c:\\2222.jpg");
//下面代码将被加上水印的图片转换为JPEG、JPG文件
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
System.out.println("水印已经添加成功!");
logger.info("----------调用生成图片方法,产生图片结束----------");
return true;
}
// 第2种方法:使用NIO中的管道到管道传输
// 实现方法很简单,分别对2个文件构建输入输出流,并且使用一个字节数组作为我们内存的缓存器, 然后使用流从f1
// 中读出数据到缓存里,在将缓存数据写到f2里面去.这里的缓存是2MB的字节数组
// 现方法:在第一种实现方法基础上对输入输出流获得其管道,然后分批次的从f1的管道中像f2的管道中输入数据每次输入的数据最大为2MB
// 由于另外2种方法内部都使用了
// 字节数组作为缓存中转,在加上NIO内部有一个贴近系统的缓存区,这无意就增加了另一个缓存器,所以相对于这2个方法就要慢许多,,如果不使用
// 字节数组作为数据中转的话相信速度会更快的..
// 不过比较惊讶的是 管道向管道传输的速度还是真挺吓人,,,
public static long forFileCopy(File inputFile, File destFile) throws Exception
{
long time = new Date().getTime();
int length = 2097152;
FileInputStream in = new FileInputStream(inputFile);
FileOutputStream out = new FileOutputStream(destFile);
FileChannel inC = in.getChannel();
FileChannel outC = out.getChannel();
int i = 0;
while (true)
{
if (inC.position() == inC.size())
{
inC.close();
outC.close();
return new Date().getTime() - time;
}
if ((inC.size() - inC.position()) < 20971520)
length = (int) (inC.size() - inC.position());
else
length = 20971520;
inC.transferTo(inC.position(), length, outC);
inC.position(inC.position() + length);
i++;
}
}
public static void main(String[] args) throws Exception
{
File file = new File("c:/55.jpg");
generateImage(file, "c:/33.jpg", ".jpg", 640, 480);
}
}
分享到:
相关推荐
"文字图片加固定水印图片"这个标题所指的,就是一种技术或工具,它能够帮助用户在他们的图片上添加固定的文字或者图像水印,并且允许用户自定义水印的透明度等属性。下面我们将详细探讨这一技术及其应用。 首先,...
- 要注意的是,水印图片应与主图片保持合适的相对位置,可能需要进行坐标计算,并确保水印不会遮挡重要信息。 4. **文字水印**: - 文字水印是将文本添加到图片上,通常用于添加版权信息。可以使用Graphics对象的...
我们可以加载水印图片,同样使用Graphics对象在目标图像上绘制,通过设置混合模式(如Multiply或Overlay)实现水印与原图的融合。水印的位置可以通过坐标控制,可以固定在图像的某个角落,也可以动态计算,如根据...
- **创建缩略图**:`MakeThumbnail`方法使用`GetThumbnailImage`方法生成固定大小的缩略图。 #### 五、注意事项 - 在实际应用中,还需要考虑文件的存储位置、权限等问题。 - 对于大量图片处理的情况,建议使用异步...
2. **设定字体和大小**:选择合适的字体文件,并设定字体大小。在PHP中,可以使用`imageloadfont()`加载自定义字体。 3. **设置颜色**:使用`imagecolorallocate()`分配水印文字的颜色。 4. **计算位置**:根据...
3. **图像读取与处理**:源码需要读取图片文件,然后在图像数据上添加水印。这包括理解图像的格式(如JPEG、PNG等),加载图像数据,以及对图像进行操作。 4. **保存处理结果**:完成水印添加后,软件需要将处理后...
在IT行业中,生成缩略图和添加水印是常见的图像处理任务,特别是在网站开发、社交媒体分享、图片库管理和数字营销中。本压缩包文件“生成缩略图并加水印文字源码.zip”提供了一套源代码,用于帮助开发者实现这两个...
这里的`watermark.png`是你的水印图片,你可以调整透明度(opacity)和位置。 3. **批量处理**:如果需要为大量图片添加水印,可以编写脚本进行批量处理。在前端,可以遍历所有图片并使用上述方法处理;在后端,...
批量处理功能意味着它可以遍历指定文件夹中的所有图片文件,逐一进行水印的添加。这对于拥有大量图片需要处理的情况非常实用,极大地提高了工作效率。 对于文字水印,用户可以自定义水印的文字内容,比如版权信息、...
请注意,上述代码只是一个基础示例,实际应用中可能需要处理更多细节,如错误处理、图片大小调整、适应不同PDF页面尺寸等。此外,根据你的需求,你可能还需要考虑线程安全、内存管理以及性能优化等问题。 总的来说...
5. **水印的定位和透明度**:水印的位置可以是固定的,也可以是动态的,根据每一页的大小自动调整。此外,水印通常具有一定的透明度,以便不影响正文的阅读。我们可以设置水印的透明度(alpha值)和位置坐标。 6. *...
- `K`表示图像分块的大小(这里为8x8),这在DCT变换中很重要,因为DCT通常应用于固定大小的图像块上。 - 初始化了几个零矩阵,如`I`, `II`, `B`, `Idct`, `D`等,用于存储图像、DCT系数、嵌入水印后的DCT系数等。...
总结来说,C#实现的上传图片、保存图片、加水印和生成缩略图的功能涉及到了文件上传处理、图片操作(包括保存、缩放和加水印)以及错误处理等核心概念。通过合理设计和组织代码,可以构建出高效且可靠的图片处理系统...
该算法将图像划分为固定大小的块,然后在每个块的DCT中频位置嵌入水印。嵌入过程根据水印信息和预生成的随机序列(基于密码种子)来决定是增加还是减少DCT系数。水印提取时,同样按块操作,通过比较块中的DCT系数与...
`ImageHelper`可能包含对图片进行哈希计算的主要逻辑,包括读取图片、预处理、计算哈希值等功能。而`ImageUtil`可能是通用的图片处理工具类,包含如图片转换、缩放等辅助方法。 4. **哈希值比对**: 保存原始图片...
`$thumb_on`表示是否开启缩略图功能,`$thumb_type`表示缩略图生成方式(例如按比例缩放或固定大小),`$thumb_width`和`$thumb_height`指定缩略图的宽高,`$thumb_fix`则用于定义缩略图的后缀名。 - `this->thumb_...
2. **裁剪**:除了简单的缩放,该类还支持基于中心点或指定区域的裁剪,可以用于生成固定尺寸的缩略图,即使原始图片尺寸与目标尺寸不匹配。 3. **质量控制**:用户可以通过设置参数来控制生成缩略图的质量,平衡...
质量设置,允许用户在文件大小和图片质量之间做出平衡;以及批量重命名功能,方便整理和管理生成的缩略图。 在实际应用中,批量缩略图工具2.7版可能还包括一些自定义设置,如添加边框、水印或进行简单的图像增强...
2. **图像质量控制**:在生成缩略图时,通常需要调整JPEG或PNG的压缩级别以平衡图片质量与文件大小。 3. **裁剪**:对于长宽比不匹配的图片,可能需要进行裁剪以适应预设的缩略图尺寸。 4. **格式转换**:源代码...