nginx 配置文件:
<code><span># document ppt convert Configuration.</span>
upstream <span>document</span>.polyv.net {
server <span>127.0</span><span>.0</span><span>.1</span>:<span>8080</span>;
}
server {
listen <span>80</span>;
server_name <span>document</span>.polyv.net;
index index.html index.htm;
charset utf-<span>8</span>;
client_max_body_size <span>1000</span>m;
<span># ignore favicon.ico not exist.</span>
location = /favicon.ico {
log_not_found <span>off</span>;
access_log <span>off</span>;
}
<span># not allow to visit hidden files.</span>
location ~ /\. {
deny all;
access_log <span>off</span>;
log_not_found <span>off</span>;
}
location / {
<span>if</span> ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$) {
add_header Content-<span>Disposition</span>: <span>'attachment;'</span>;
add_header Content-<span>Type</span>: <span>'APPLICATION/OCTET-STREAM'</span>;
}
proxy_pass <span>http</span>:<span>//</span><span>document</span>.polyv.net;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REQUEST_HOST $host;
<span># include proxy.conf;</span>
charset UTF-<span>8</span>;
}
<span># user upload files</span>
location <span>/images/</span> {
<span>#expires 7d;</span>
alias <span>/data03/ovp/blobs/</span>;
proxy_store <span>on</span>;
proxy_store_access <span>user</span>:rw <span>group</span>:rw <span>all</span>:rw;
proxy_set_header Accept-Encoding <span>""</span>;
<span>if</span> ( !-f $request_filename ) {
proxy_pass <span>http</span>:<span>//</span><span>document</span>.polyv.net;
}
}
location <span>/blobs/</span> {
<span>#expires 7d;</span>
alias <span>/data03/ovp/blobs/</span>;
}
location <span>/preview/images/</span> {
<span>#expires 7d;</span>
alias <span>/data03/ovp/blobs/</span>;
proxy_store <span>on</span>;
proxy_store_access <span>user</span>:rw <span>group</span>:rw <span>all</span>:rw;
proxy_set_header Accept-Encoding <span>""</span>;
<span>if</span> ( !-f $request_filename ) {
proxy_pass <span>http</span>:<span>//</span><span>document</span>.polyv.net;
}
}
}
</code>代理输出缩放图片
<code>package <span>com</span><span>.document</span><span>.handle</span><span>.controller</span><span>;</span>import java<span>.io</span><span>.BufferedInputStream</span><span>;</span>
import java<span>.io</span><span>.File</span><span>;</span>
import java<span>.io</span><span>.IOException</span><span>;</span>
import java<span>.io</span><span>.OutputStream</span><span>;</span>
import java<span>.net</span><span>.HttpURLConnection</span><span>;</span>
import java<span>.net</span><span>.URL</span><span>;</span>import javax<span>.servlet</span><span>.http</span><span>.HttpServletRequest</span><span>;</span>
import javax<span>.servlet</span><span>.http</span><span>.HttpServletResponse</span><span>;</span>import org<span>.apache</span><span>.commons</span><span>.lang</span>3<span>.StringUtils</span><span>;</span>
import org<span>.slf</span>4j<span>.Logger</span><span>;</span>
import org<span>.slf</span>4j<span>.LoggerFactory</span><span>;</span>
import org<span>.springframework</span><span>.stereotype</span><span>.Controller</span><span>;</span>
import org<span>.springframework</span><span>.web</span><span>.bind</span><span>.ServletRequestUtils</span><span>;</span>
import org<span>.springframework</span><span>.web</span><span>.bind</span><span>.annotation</span><span>.PathVariable</span><span>;</span>
import org<span>.springframework</span><span>.web</span><span>.bind</span><span>.annotation</span><span>.RequestMapping</span><span>;</span>import <span>com</span><span>.document</span><span>.tool</span><span>.ImageMagickUtils</span><span>;</span>
import <span>com</span><span>.document</span><span>.tool</span><span>.SystemConfig</span><span>;</span>@Controller
public class ImageAgentController {
private static final Logger LOG = LoggerFactory<span>.getLogger</span>(ImageAgentController<span>.class</span>)<span>;</span><span>/**
* ppt预览图片代理输出
* @throws IOException
*/</span>
@RequestMapping(<span>"/preview/images/{year}/{month}/{md5id}/{preview}/{filename}.{ext}"</span>)
public void cropImage(@PathVariable String year, @PathVariable String month, @PathVariable String md5id,
@PathVariable String preview, @PathVariable String filename, @PathVariable String ext,
HttpServletRequest request, HttpServletResponse response) throws IOException {
// String rootDir = <span>"/data03/ovp/blobs/"</span><span>;</span>
String rootDir = SystemConfig<span>.getBlobDirectory</span>()<span>;</span>
String oname = filename<span>.substring</span>(<span>1</span>, filename<span>.length</span>())<span>;// 原图文件名</span>
String dirString = rootDir + year + <span>"/"</span> + month + <span>"/"</span> + md5id + <span>"/"</span> + oname + <span>"."</span> + ext<span>;</span>
String targetFileString = rootDir + year + <span>"/"</span> + month + <span>"/"</span> + md5id + <span>"/preview/"</span> + filename + <span>"."</span> + ext<span>;</span> //如果原图存在
File originImage = new File(oname)<span>;</span>
if(originImage<span>.exists</span>()){
LOG<span>.info</span>(<span>"corpImage..."</span> + dirString + <span>" -> "</span> + targetFileString)<span>;</span>
File newfile = new File(targetFileString)<span>;</span>
String pathString = newfile<span>.getParent</span>()<span>;</span>
LOG<span>.info</span>(<span>"pathString...{} {}"</span>, pathString)<span>;</span>
File pathFile = new File(pathString)<span>;</span>
if (!pathFile<span>.exists</span>()) {
LOG<span>.info</span>(<span>"---create file---"</span>)<span>;</span>
pathFile<span>.mkdirs</span>()<span>;</span>
}
boolean status = ImageMagickUtils<span>.scale</span>(dirString, targetFileString, <span>240</span>, <span>180</span>)<span>;</span>
if (status) {
response<span>.reset</span>()<span>;</span>
response<span>.setContentType</span>(<span>"image/"</span> + ext)<span>;</span> java<span>.io</span><span>.InputStream</span><span>in</span> = new java<span>.io</span><span>.FileInputStream</span>(targetFileString)<span>;</span>
// FilenameUrlUtils<span>.getImageFilename</span>(targetFileString)<span>;</span> if (<span>in</span> != null) {
byte[] b = new byte[<span>1024</span>]<span>;</span>
int len<span>;</span>
while ((len = <span>in</span><span>.read</span>(b)) != -<span>1</span>) {
response<span>.getOutputStream</span>()<span>.write</span>(b)<span>;</span>
}
<span>in</span><span>.close</span>()<span>;</span>
}
}
}else{
LOG<span>.info</span>(<span>"原图目录不存在-preview:{}"</span>,dirString)<span>; </span>
}
}
<span>/**
* ppt固定尺寸图片代理输出
* @throws IOException
* http://document.polyv.net/images/2016/03/de37d2ceb11ac068c18c5e4428541075/jpg-3/1000x540.png
*
* http://document.polyv.net/images/2016/03/de37d2ceb11ac068c18c5e4428541075/jpg-3.png
*/</span>
@RequestMapping(<span>"/images/{year}/{month}/{md5id}/{filename}/{width}x{height}.{ext}"</span>)
public void cropfixedImage(@PathVariable String year, @PathVariable String month, @PathVariable String md5id,
@PathVariable String filename, @PathVariable Integer width, @PathVariable Integer height, @PathVariable String ext,
HttpServletRequest request, HttpServletResponse response) throws IOException {
// String rootDir = <span>"/data03/ovp/blobs/"</span><span>;</span>
String rootDir = SystemConfig<span>.getBlobDirectory</span>()<span>;</span>
//String oname = filename<span>.substring</span>(<span>1</span>, filename<span>.length</span>())<span>;// 原图文件名</span>
String dirString = rootDir + year + <span>"/"</span> + month + <span>"/"</span> + md5id + <span>"/"</span> + ( filename + <span>"."</span> + ext)<span>;</span>
String targetFileString = rootDir + year + <span>"/"</span> + month + <span>"/"</span> + md5id + <span>"/"</span> + filename + <span>"/"</span> + (width + <span>"x"</span> + height + <span>"."</span> + ext)<span>;</span> //如果原图存在
File originImage = new File(dirString)<span>;</span>
if(originImage<span>.exists</span>()){
File targetFileStringFile = new File(targetFileString)<span>;</span>
if(!targetFileStringFile<span>.exists</span>()){
LOG<span>.info</span>(<span>"corpImage..."</span> + dirString + <span>" -> "</span> + targetFileString)<span>;</span>
File newfile = new File(targetFileString)<span>;</span>
String pathString = newfile<span>.getParent</span>()<span>;</span>
LOG<span>.info</span>(<span>"pathString...{} {}"</span>, pathString)<span>;</span>
File pathFile = new File(pathString)<span>;</span>
if (!pathFile<span>.exists</span>()) {
LOG<span>.info</span>(<span>"---create file---"</span>)<span>;</span>
pathFile<span>.mkdirs</span>()<span>;</span>
}
ImageMagickUtils<span>.resizeWH</span>(dirString, targetFileString,width,height)<span>;</span>
}
response<span>.setContentType</span>(<span>"image/"</span> + ext)<span>;</span>
java<span>.io</span><span>.InputStream</span><span>in</span> = null<span>;</span>
try{
<span>in</span> = new java<span>.io</span><span>.FileInputStream</span>(targetFileString)<span>;</span>
response<span>.setContentLength</span>(<span>in</span><span>.available</span>())<span>;</span>
byte[] buffer = new byte[<span>1024</span>]<span>;</span>
int count = <span>0</span><span>;</span>
while ((count = <span>in</span><span>.read</span>(buffer)) > <span>0</span>) {
response<span>.getOutputStream</span>()<span>.write</span>(buffer, <span>0</span>, count)<span>;</span>
}
response<span>.flushBuffer</span>()<span>;</span>
}catch(Exception e){
e<span>.printStackTrace</span>()<span>;</span>
}finally {
try {
<span>in</span><span>.close</span>()<span>;</span>
} catch (Exception e) {
}
}
}else{
LOG<span>.info</span>(<span>"原图目录不存在:{}"</span>,dirString)<span>;</span>
}
}
<span>/**
* 图片下载
*/</span>
@RequestMapping(<span>"get/image/data"</span>)
public void downloadImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
String filePath = ServletRequestUtils<span>.getStringParameter</span>(request, <span>"filePath"</span>, <span>""</span>)<span>; //图片访问路劲</span>
String fileName = ServletRequestUtils<span>.getStringParameter</span>(request, <span>"fileName"</span>, <span>""</span>)<span>; //名称</span> if(StringUtils<span>.isNotBlank</span>(filePath) || StringUtils<span>.isNotBlank</span>(fileName)){
String destUrl = filePath<span>;</span>
//LOG<span>.info</span>(<span>"--------------"</span>+filePath)<span>; </span>
String fileFormat=filePath<span>.substring</span>(filePath<span>.lastIndexOf</span>(<span>"."</span>))<span>;</span>
//String name=fileName<span>.trim</span>()+fileFormat<span>;</span>
String name=filePath<span>.substring</span>(filePath<span>.lastIndexOf</span>(<span>"/"</span>)+<span>1</span>, filePath<span>.length</span>())<span>; </span>
//File f = new File(filePath)<span>;</span>
//response<span>.setHeader</span>(<span>"Content-Disposition"</span>, <span>"attachment; filename="</span>+java<span>.net</span><span>.URLEncoder</span><span>.encode</span>(f<span>.getName</span>(),<span>"UTF-8"</span>))<span>; </span>
//LOG<span>.info</span>(<span>"--------------"</span>+f<span>.getName</span>())<span>;</span> // 建立链接
URL url = new URL(destUrl)<span>; </span>
HttpURLConnection httpUrl = (HttpURLConnection) url<span>.openConnection</span>()<span>; </span>
// 连接指定的资源
httpUrl<span>.connect</span>()<span>; </span>
// 获取网络输入流
BufferedInputStream bis = new BufferedInputStream(httpUrl<span>.getInputStream</span>())<span>; </span> Integer lenf=httpUrl<span>.getContentLength</span>()<span>;</span>
//String lenf=this<span>.getFileLength</span>(<span>4189053</span>, <span>7189053</span>)<span>;</span>
response<span>.setContentType</span>(<span>"application/x-msdownload"</span>)<span>; </span>
response<span>.setHeader</span>(<span>"Content-Length"</span>, lenf<span>.toString</span>())<span>;//文件大小值5几M</span>
response<span>.setHeader</span>(<span>"Content-Disposition"</span>, <span>"attachment; filename="</span>+java<span>.net</span><span>.URLEncoder</span><span>.encode</span>(name,<span>"UTF-8"</span>))<span>;</span>
OutputStream <span>out</span> = response<span>.getOutputStream</span>()<span>;</span>
byte[] buf = new byte[<span>1024</span>]<span>; </span>
if (destUrl != null) {
BufferedInputStream br = bis<span>; </span>
int len = <span>0</span><span>; </span>
while ((len = br<span>.read</span>(buf)) > <span>0</span>){
<span>out</span><span>.write</span>(buf, <span>0</span>, len)<span>; </span>
}
br<span>.close</span>()<span>; </span>
}
<span>out</span><span>.flush</span>()<span>; </span><span>out</span><span>.close</span>()<span>; </span>
}
}
}
</code>图片缩放的业务
<code><span>package</span> com.document.tool;
<span>import</span> java.io.IOException;
<span>import</span> javax.swing.ImageIcon;
<span>import</span> org.apache.commons.exec.CommandLine;
<span>import</span> org.apache.commons.exec.DefaultExecuteResultHandler;
<span>import</span> org.apache.commons.exec.DefaultExecutor;
<span>import</span> org.apache.commons.exec.ExecuteException;
<span>import</span> org.apache.commons.exec.ExecuteWatchdog;
<span>import</span> org.apache.commons.exec.Executor;
<span>import</span> org.slf4j.Logger;
<span>import</span> org.slf4j.LoggerFactory;
<span>/**
* 使用ImageMagick对图片文件进行处理的工具类。
*<span> @author</span> XingNing OU
*/</span><span>public</span><span>abstract</span><span><span>class</span><span>ImageMagickUtils</span> {</span><span>private</span><span>static</span><span>final</span> String EXECUTABLE_CONVERT = <span>"/usr/bin/convert"</span>; <span>// convert命令</span><span>private</span><span>static</span><span>final</span> String EXECUTABLE_COMPOSITE = <span>"/usr/bin/composite"</span>; <span>// composite命令</span><span>private</span><span>static</span><span>final</span><span>long</span> EXECUTE_TIMEOUT = <span>30</span> * <span>60</span> * <span>1000</span>L; <span>// 30 minutes</span><span>private</span><span>static</span><span>final</span> Logger LOG = LoggerFactory.getLogger(ImageMagickUtils.class);
<span>/**
* 执行图片处理的命令。
*<span> @param</span> cmdLine 待执行的命令
*<span> @return</span> exitValue,一般等于0时表示正常运行结束
*<span> @throws</span> ExecuteException 命令执行失败时抛出此异常
*<span> @throws</span> IOException 当发生IO错误时抛出此异常
*<span> @throws</span> InterruptedException 当等待异步返回结果被中断时抛出此异常
*/</span><span>public</span><span>static</span><span>int</span><span>executeCommandLine</span>(CommandLine cmdLine) <span>throws</span> ExecuteException, IOException,
InterruptedException {
Executor executor = <span>new</span> DefaultExecutor();
executor.setExitValue(<span>0</span>);
<span>// Kill a run-away process after EXECUTE_TIME milliseconds.</span>
ExecuteWatchdog watchdog = <span>new</span> ExecuteWatchdog(EXECUTE_TIMEOUT);
executor.setWatchdog(watchdog);
<span>// Execute the print job asynchronously.</span>
DefaultExecuteResultHandler resultHandler = <span>new</span> DefaultExecuteResultHandler();
executor.execute(cmdLine, resultHandler);
<span>// Some time later the result handler callback was invoked.</span>
resultHandler.waitFor();
<span>// So we can safely request the exit value.</span><span>return</span> resultHandler.getExitValue();
}
<span>/**
* 按照高宽比例缩小图片。
*<span> @param</span> src 源图片
*<span> @param</span> dst 目标图片
*<span> @param</span> width 图片图片的宽度
*<span> @param</span> height 目标图片的高度
*<span> @return</span> 是否处理成功
*/</span><span>public</span><span>static</span><span>boolean</span><span>scale</span>(String src, String dst, <span>int</span> width, <span>int</span> height) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_CONVERT);
cmdLine.addArgument(src);
cmdLine.addArgument(<span>"-scale"</span>);
cmdLine.addArgument(width + <span>"x"</span> + height);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"缩略图片时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 按照高宽比例缩小图片。
*<span> @param</span> src 源图片
*<span> @param</span> dst 目标图片
*<span> @param</span> width 图片图片的宽度
*<span> @param</span> height 目标图片的高度
*<span> @return</span> 是否处理成功
*/</span><span>public</span><span>static</span><span>boolean</span><span>thumbnail</span>(String src, String dst, <span>int</span> width, <span>int</span> height) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_CONVERT);
cmdLine.addArgument(src);
cmdLine.addArgument(<span>"-thumbnail"</span>);
cmdLine.addArgument(width + <span>"x"</span> + height);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"缩略图片时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 添加图片水印。
*<span> @param</span> src 源图片
*<span> @param</span> dst 目标图片
*<span> @param</span> logofile 水印图片
*<span> @param</span> dissolve 和水印的融合度,0-100的数字
*<span> @param</span> gravity 叠放方向,East,West,North,South,NorthEast,NorthWest,SouthEast,SouthWest
*<span> @return</span> 是否处理成功
*/</span><span>public</span><span>static</span><span>boolean</span><span>drawLogo</span>(String src, String dst, String logofile, <span>int</span> dissolve, String gravity) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_COMPOSITE);
cmdLine.addArgument(<span>"-dissolve"</span>);
cmdLine.addArgument(dissolve + <span>"%"</span>);
cmdLine.addArgument(<span>"-gravity"</span>);
cmdLine.addArgument(gravity);
cmdLine.addArgument(logofile);
cmdLine.addArgument(src);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"添加图片水印时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 添加图片水印。
*<span> @param</span> src 源图片
*<span> @param</span> dst 目标图片
*<span> @param</span> logofile 水印图片
*<span> @param</span> dissolve 和水印的融合度,0-100的数字
*<span> @param</span> x 水印距离左下角的距离
*<span> @param</span> y 水印距离右下角的距离
*<span> @return</span> 是否处理成功
*/</span><span>public</span><span>static</span><span>boolean</span><span>drawLogo</span>(String src, String dst, String logofile, <span>int</span> dissolve, <span>int</span> x, <span>int</span> y) {
ImageIcon icon = <span>new</span> ImageIcon(src);
<span>int</span> width = icon.getIconWidth(); <span>// 源图的宽</span><span>int</span> height = icon.getIconHeight(); <span>// 源图的高</span> String _x = String.valueOf(width - x); <span>// 在x轴上水印图片的左上顶点距离图片左上角的距离</span>
String _y = String.valueOf(height - y); <span>// 在y轴上水印图片的左上顶点距离图片左上角的距离</span><span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_COMPOSITE);
cmdLine.addArgument(<span>"-dissolve"</span>);
cmdLine.addArgument(dissolve + <span>"%"</span>);
cmdLine.addArgument(<span>"-geometry"</span>);
cmdLine.addArgument(_x + <span>"+"</span> + _y);
cmdLine.addArgument(logofile);
cmdLine.addArgument(src);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"添加图片水印时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 裁剪图片。
*<span> @param</span> src 源图片
*<span> @param</span> dst 目标图片
*<span> @param</span> width 目标宽度
*<span> @param</span> height 目标高度
*<span> @param</span> left 裁剪位置:距离左边的像素
*<span> @param</span> top 裁剪位置:距离上边的像素
*<span> @return</span> 是否处理成功
*/</span><span>public</span><span>static</span><span>boolean</span><span>crop</span>(String src, String dst, <span>int</span> width, <span>int</span> height, <span>int</span> left, <span>int</span> top) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_CONVERT);
cmdLine.addArgument(src);
cmdLine.addArgument(<span>"-crop"</span>);
cmdLine.addArgument(width + <span>"x"</span> + height + <span>"+"</span> + left + <span>"+"</span> + top);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"裁剪图片时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 获取矩形的小图。
*<span> @param</span> src 源图片
*<span> @param</span> dst 目标图片
*<span> @param</span> width 目标宽度
*<span> @param</span> height 目标高度
*<span> @param</span> left 裁剪位置:距离左边的像素
*<span> @param</span> top 裁剪位置:距离上边的像素
*<span> @return</span> 是否处理成功
*/</span><span>public</span><span>static</span><span>boolean</span><span>cropRect</span>(String src, String dst, <span>int</span> width, <span>int</span> height, <span>int</span> left, <span>int</span> top) {
ImageIcon icon = <span>new</span> ImageIcon(src);
<span>int</span> origWidth = icon.getIconWidth();
<span>int</span> origHeight = icon.getIconHeight();
<span>int</span>[] s = <span>new</span><span>int</span>[<span>2</span>];
<span>if</span> (origWidth < origHeight) { <span>// 以宽为标准</span>
s = getSize(origWidth, origHeight, width, height, <span>1</span>);
} <span>else</span> {<span>// 以高为标准</span>
s = getSize(origWidth, origHeight, width, height, <span>2</span>);
}
<span>if</span> (thumbnail(src, dst, s[<span>0</span>], s[<span>1</span>])) {
<span>return</span> crop(src, dst, width, height, left, top);
}
<span>return</span><span>false</span>;
}
<span>/**
* 加边框。
*<span> @param</span> src 源图片
*<span> @param</span> dst 目标图片
*<span> @param</span> borderWidth 边框的宽度
*<span> @param</span> borderHeight 边框的高度
*<span> @param</span> borderColor 边框的颜色
*<span> @return</span> 是否处理成功
*/</span><span>public</span><span>static</span><span>boolean</span><span>border</span>(String src, String dst, <span>int</span> borderWidth, <span>int</span> borderHeight, String borderColor) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_CONVERT);
cmdLine.addArgument(<span>"-bordercolor"</span>);
cmdLine.addArgument(borderColor);
cmdLine.addArgument(<span>"-border"</span>);
cmdLine.addArgument(borderWidth + <span>"x"</span> + borderHeight);
cmdLine.addArgument(src);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"加图片边框时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 转换图片格式。
*<span> @param</span> src 源图片
*<span> @param</span> dst 目标图片
*<span> @param</span> format 转换的格式
*<span> @return</span> 是否处理成功
*/</span><span>public</span><span>static</span><span>boolean</span><span>format</span>(String src, String dst, String format) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_CONVERT);
cmdLine.addArgument(src);
cmdLine.addArgument(<span>"-format"</span>);
cmdLine.addArgument(<span>"'"</span> + format + <span>"'"</span>);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"转换图片格式时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 转换无限极的TIFF图片。
*/</span><span>public</span><span>static</span><span>boolean</span><span>convertTiff</span>(String src, String dst) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_CONVERT);
cmdLine.addArgument(src);
cmdLine.addArgument(<span>"-colorspace"</span>);
cmdLine.addArgument(<span>"RGB"</span>);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"转换图片格式时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 获得要压缩图片的大小。
*<span> @param</span> w 图片的原宽度
*<span> @param</span> h 图片的原高度
*<span> @param</span> width 标准宽
*<span> @param</span> height 标准高
*<span> @param</span> type 类型 1-以宽为标准压缩 2-以高为标准压缩 3-以比例大小压缩
*<span> @return</span> size[0]-要压缩的宽度, size[1]-要压缩的高度
*/</span><span>public</span><span>static</span><span>int</span>[] <span>getSize</span>(<span>double</span> w, <span>double</span> h, <span>double</span> width, <span>double</span> height, <span>int</span> type) {
<span>if</span> (w < width) {<span>// 如果原宽度比标准宽度小</span>
width = w;
}
<span>if</span> (h < height) {<span>// 如果原高度比标准高度小</span>
height = h;
}
<span>double</span> scale = w / h;
<span>switch</span> (type) {
<span>case</span><span>1</span>:
height = width / scale;
<span>break</span>;
<span>case</span><span>2</span>:
width = height * scale;
<span>break</span>;
<span>case</span><span>3</span>:
<span>if</span> (width / height > scale) {
width = height * scale;
} <span>else</span><span>if</span> ((width / height) < scale) {
height = width / scale;
}
<span>break</span>;
}
<span>int</span>[] size = <span>new</span><span>int</span>[<span>2</span>];
size[<span>0</span>] = (<span>int</span>) width;
size[<span>1</span>] = (<span>int</span>) height;
<span>return</span> size;
}
<span>/**
* 指定宽度。
*<span> @param</span> src
*<span> @param</span> width
*<span> @param</span> dst
*/</span><span>public</span><span>static</span><span>boolean</span><span>resize</span>(String src, <span>int</span> width, String dst) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_CONVERT);
cmdLine.addArgument(src);
cmdLine.addArgument(<span>"-resize"</span>);
cmdLine.addArgument(width + <span>""</span>);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"缩略图片时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
<span>/**
* 指定宽度、高度。
*<span> @param</span> src
*<span> @param</span> width
*<span> @param</span> dst
*/</span><span>public</span><span>static</span><span>boolean</span><span>resizeWH</span>(String src,String dst, <span>int</span> width, <span>int</span> height ) {
<span>// 构建命令</span>
CommandLine cmdLine = <span>new</span> CommandLine(EXECUTABLE_CONVERT);
cmdLine.addArgument(src);
cmdLine.addArgument(<span>"-resize"</span>);
cmdLine.addArgument(width + <span>"x"</span> + height +<span>"!"</span>);
cmdLine.addArgument(dst);
<span>try</span> {
executeCommandLine(cmdLine);
<span>return</span><span>true</span>;
} <span>catch</span> (Exception e) {
LOG.error(<span>"缩略图片时发生异常,Cause: "</span>, e);
<span>return</span><span>false</span>;
}
}
}
</code>服务器上要安装imagemagick,
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了利用Nginx 代理输出缩放图片,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号