app后端设计(12)--图片的处理

2023-05-16

app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版。

 

一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变。

 

在app后端设计(1)—api(http://blog.csdn.net/newjueqi/article/details/14053733)这篇文章中,我提到过app后台图片处理的一个基本原则,数据库中只保存原图的路径。对于同一张图片来说,针对不同机型,不同app版本所需要的不同尺寸,使用动态生成的策略,大体思路如下:

 

(1)      在图片的url末尾加上参数,声明需要生成的图片的新的尺寸,例如:户端需要图片(http://www.baidu.com/img/bdlogo.gif)的80*80的尺寸,则在图片的路径加上宽和高的参数(类似于CDN的机制) http://www.baidu.com/img/bdlogo.gif?w=80&h=80

(2)      服务器接收到图片的请求,先在缓存中查找这个尺寸的图片是否已经生成,如果已经在缓存中有记录,则不用重新生成。

(3)      如果该尺寸的图片还没生成,则生成新的图片尺寸,并把新生成的图片路径放在缓存中。

 

 

在app整个系统架构中,图片应该有两层缓存:

(1)      app本地的图片缓存,当app中没有该图片时,才去服务取

(2)      服务器的图片缓存,记录图片不同尺寸的保存路径

 

我的建议是,如果不差钱,直接使用七牛的云存储的服务吧,云存储不但可以加速图片的下载上传,也能实现图片的大量操作。要知道,速度才是用户体验最直接的部分。

 

如果真的要自己实现图片的裁切,那么要考虑到图片操作是非常消耗CPU,内存,和大量的磁盘IO,所以在选择图片处理工具要慎重!!!

 

推荐使用GraphicsMagick,一个久经考验的图片处理软件,支持多个平台,而且支持多种语言的客服端。GraphicsMagick是ImageMagick的一个分支,相对于ImageMagick而言,TA处理速度更快,消耗资源更少,并且大的图片处理网站,如 Flickr and Etsy  已经在使用TA了。

 

使用GraphicsMagick时,最折腾的是怎么配GraphicsMagick环境,查阅了大量的文章,都注明在linux下不能使用cmd.setSearchPath(path); ,但经过我实验,是可以的,而且配了这个的话,可以让linux和win下都运行同一段代码,只要把path放在配置文件中就好了。

 

下面我写的GraphicsMagick+Im4java图片裁剪的工具类,


/**
 * 
 */
package com.bmob.worker.image;

import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutionException;



/**

 */
public class Image {

	/*
	 1、指定宽,高自适应,等比例缩放;
	 2、指定高, 宽自适应,等比例缩放;
	 3、指定最长边,短边自适应,等比例缩放;
	 4、指定最短边,长边自适应,等比例缩放;
	 5、指定最大宽高, 等比例缩放;
	 6、固定宽高, 居中裁剪)
	 */
	public static int DefineWidth=1; 
	public static int DefineHeight=2; 
	public static int DefineLong=3; 
	public static int DefineShort=4; 
	public static int MaxWidthHeight=5; 
	public static int DefineWidthHeight=6; 
	
	/**
	 * 图片缩放的方法
	 * 
	 * @param mode
	 1、指定宽,高自适应,等比例缩放;
	 2、指定高, 宽自适应,等比例缩放;
	 3、指定最长边,短边自适应,等比例缩放;
	 4、指定最短边,长边自适应,等比例缩放;
	 5、指定最大宽高, 等比例缩放;
	 6、固定宽高, 居中裁剪)
	 * @param src 源文件路径
	 * @param desc 目标文件路径
	 * @param width 指定宽
	 * @param height 指定高
	 * @param maxFrame 指定最长边
	 * @param minFrame 指定最短边
	 * @return
	 * @throws Exception
	 */
	public  String resize(int mode, String src,String desc, int width, int height, int maxFrame, int minFrame) throws Exception {
		
		String str="";
		
		BHPApplication.init();
		
		// create command
		ConvertCmd cmd = this.getCmd();
		IMOperation op =null;
		if( mode==Image.DefineWidth ){
			op=this.resizeDefineWidth( src,desc, width, height);
		}else if( mode==Image.DefineHeight ){
			op=this.resizeDefineHeight( src,desc, width, height);
		}else if( mode==Image.DefineLong ){
			op=this.resizeDefineLong( src,desc, maxFrame);
		}else if( mode==Image.DefineShort ){
			op=this.resizeDefineShort( src,desc, minFrame);
		}else if( mode==Image.MaxWidthHeight ){
			op=this.resizeMaxWidthHeight( src,desc, width, height);
		}else if( mode==Image.DefineWidthHeight ){
			op=this.resizeDefineWidthHeight( src,desc, width, height);
		}
		
		cmd.run(op);
		
		return str;
	}
	
	//指定宽,高自适应,等比例缩放;
	public  IMOperation resizeDefineWidth(String src,String desc, int width, int height){
		IMOperation op = new IMOperation();
		op.addImage(src);
		op.resize(width,null);
		op.addImage(desc);		
		return op;
	}
	
	//指定高, 宽自适应,等比例缩放;
	public  IMOperation resizeDefineHeight(String src,String desc, int width, int height){
		IMOperation op = new IMOperation();
		op.addImage(src);
		op.resize(null,height);
		op.addImage(desc);		
		return op;
	}
	
	//指定最长边,短边自适应,等比例缩放;
	public  IMOperation resizeDefineLong(String src,String desc, int maxFrame) throws Exception{
		
		InputStream is = new FileInputStream(src);//通过文件名称读取
		BufferedImage buff = ImageIO.read(is);
		int srcWidth=buff.getWidth();//得到图片的宽度
		int srcHeight=buff.getHeight();  //得到图片的高度
		is.close(); //关闭Stream
		
		IMOperation op = new IMOperation();
		op.addImage(src);
		if( srcWidth>srcHeight ){
			op.resize(maxFrame,null);
		}else{
			op.resize(null,maxFrame);
		}
		
		op.addImage(desc);		
		return op;
	}
	
	//指定最短边,长边自适应,等比例缩放;
	public  IMOperation resizeDefineShort(String src,String desc, int minFrame) throws Exception {
		
		InputStream is = new FileInputStream(src);//通过文件名称读取
		BufferedImage buff = ImageIO.read(is);
		int srcWidth=buff.getWidth();//得到图片的宽度
		int srcHeight=buff.getHeight();  //得到图片的高度
		is.close(); //关闭Stream		
		
		IMOperation op = new IMOperation();
		op.addImage(src);
		if( srcWidth<srcHeight ){
			op.resize(minFrame,null);
		}else{
			op.resize(null,minFrame);
		}
		op.addImage(desc);		
		return op;
	}
	
	//指定最大宽高, 等比例缩放;
	public  IMOperation resizeMaxWidthHeight(String src,String desc, int width, int height){
		IMOperation op = new IMOperation();
		op.addImage(src);
		op.resize(width,height,'!');
		op.addImage(desc);		
		return op;
	}
	
	//固定宽高, 居中裁剪
	public  IMOperation resizeDefineWidthHeight(String src,String desc, int width, int height){
		IMOperation op = new IMOperation();
		op.addImage(src);
		op.gravity("center").extent(width, height);  
		op.addImage(desc);		
		return op;
	}	
	
	public  ConvertCmd getCmd(){
		ConvertCmd cmd = new ConvertCmd(true); //set true, use GraphicsMagick
		String path = "/usr/local/GraphicsMagick/bin"; //GraphicsMagick安装路径
		cmd.setSearchPath(path);		
		return cmd;
	}
	
	

}


app后端系列文章总目录


如果您觉得这系列的文章对你有所帮助,欢迎打赏。
支付宝账号:190678908@qq.com 收款人:曾健生


新建了“app后端技术” 交流qq群:254659220 

[文章作者]曾健生

[作者邮箱]h6k65@126.com

[作者QQ]190678908

[新浪微博] @newjueqi

[博客]http://blog.csdn.net/newjueqi


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

app后端设计(12)--图片的处理 的相关文章

  • 推荐《十倍速影像阅读法》

    文章标题 推荐 十倍速影像阅读法 文章作者 newjueqi 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者 blog http blog csdn net newjueqi 文章说明 欢
  • 十. 加班等于团队建设?

    摘要 xff1a 在IT界 xff0c 加班是不可避免的事情 但是 xff0c 加班的方式和心态 xff0c 将会影响加班的效率和加班的效果 健生干货分享 xff1a 第10篇 在移动互联网的日常工作中 xff0c 不能不提的是加班 总体来
  • 十一. 没有这4项素质,别想在创业公司

    摘要 xff1a 习惯了在大企业工作方式 xff0c 初次来到创业公司工作会觉得很不习惯 xff0c 因为创业公司中 xff0c 对人员有很特殊的素质要求 健生干货分享 xff1a 第11篇 在创业公司里工作久了 xff0c 慢慢就习惯了里
  • 十二.200多万元得到的创业教训--app名字是关键

    摘要 xff1a 当完成了一个app后 xff0c 就要需要上应用市场 xff0c 下面讲一下起名和上应用市场的一些技巧 健生干货分享 xff1a 第12篇 1 必须是先上app store xff0c 再上其他应用市场 为啥要这样做 xf
  • 解决bug: .cpython-37m-x86_64-linux-gnu.so: undefined symbol:

    解决bug cpython 37m x86 64 linux gnu so undefined symbol 时间 xff1a 2023年1月23日 一 问题 用python下pytorch编写cuda算子时 xff0c 在执行setup
  • 十三.200多万元得到的创业教训--用户体验就是人性

    摘要 用户体验是在产品或服务中重要的一环 xff0c 懂得人性 xff0c 什么是良好的用户体验就很明了 健生干货分享 xff1a 第13篇 在百度百科中的定义 xff1a 用户体验 xff08 UserExperience xff0c 简
  • 软件DIY----用汇编语言给XP记事本添加“自动保存”功能

    文章标题 用汇编语言 给XP记事本添加 自动保存 功能 文章作者 newjueqi 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 使用工具 OD xff0c LordPE xff0c eXeS
  • 用16进制编辑器编写一个DLL文件

    文章标题 用16进制编辑器编写一个DLL文件 文章作者 newjueqi 作者邮箱 zengjiansheng1 64 126 com 作者QQ号 190678908 软件名称 Hello 软件大小 4K 编写语言 机器码 使用工具 Win
  • 浅谈快速阅读法

    文章标题 浅谈快速阅读法 文章作者 newjueqi 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者 blog http blog csdn net newjueqi 文章说明 欢迎转载文
  • 十四.200多万元得到的创业教训--不健康,别创业

    摘要 xff1a 34 年轻时拿命换钱 xff0c 岁数大后拿钱换命 34 xff0c 这种说法 xff0c 真的是正确的吗 xff1f 健生干货分享 xff1a 第14篇 有多少人想过 xff0c 自己创业的目的是什么 xff1f 是为了
  • 十五.电商业老二,老三也能生存

    摘要 在互联网行业 xff0c 有句话 xff1a 人们只记得老大 xff0c 但随着移动互联网的崛起 xff0c 依托于社交红利 xff0c 这个现象正慢慢发生变化 健生干货分享 xff1a 第15篇 在传统的互联网中 xff0c 入口少
  • 十六.月收入过万的淘宝从业者的执行力,吓呆我了

    摘要 淘宝开店现在好不好做 xff0c 很多人说现在淘宝已经不好做 xff0c 但淘宝的生意真的没有生存的空间了吗 在不久前 xff0c 和一个做淘宝行业相关的哥们聊天 xff0c 他自曝月收入过万 xff0c 被他那狠狠的执行力吓呆了 健
  • 自媒体16天后的总结

    摘要 在网上写了一些文章 xff0c 16天过去了 xff0c 总结一下自己在16天里的得失 健生干货分享 xff1a 第17篇 写了16天的文章 xff0c 有的文章我很用心的写 xff0c 但反应平淡 xff0c 有的文章 xff0c
  • 改变Windows窗口颜色,保护好眼睛

    研究表明 xff0c 绿色和蓝色对眼睛最好 xff0c 在长时间用电脑后 xff0c 经常看看蓝天 绿地就能在一定程度上缓解视疲劳 如果我们把电脑屏幕和网页的底色变为淡淡的苹果绿 xff0c 也可在一定程度上有效地缓眼睛疲劳症状了 在桌面上
  • 一个保护眼睛的小技巧

    一般情况用我都是800 600分辨率 xff0c 字体比较大 xff0c 看着舒服 如果在阅读文字资料时 xff0c 我喜欢用比较大的字体 xff0c 背景色是蓝色 xff0c 如下图 嘻嘻 xff0c 是不是看起来一点都不费神 xff0c
  • MySQL四种安装方式

    仓库安装 先在mysql官网上找到需要版本的域名然后用rpm安装下载下来 root 64 bb rpm ivh https repo mysql com mysql80 community release el9 1 noarch rpm
  • 十八. 200多万元得到的创业教训--社交软件之殇

    健生干货分享 xff1a 第18篇 摘要 xff1a 用了两年时间 xff0c 完成了两款社交app的开发 xff0c 两款app都挂掉了 xff0c 社交app成功的关键的是对用户 xff0c 产品的把握 xff0c 整合资源的能力 xf
  • 初学python

    文章作者 newjueqi 作者邮箱 zengjiansheng1 64 126 com 作者QQ号 190678908 作者博客 http blog csdn net newjueqi 作者声明 欢迎转载文章 xff0c 但转载请保持文章
  • 十九. 想快速开发app,需要找外包吗?

    健生干货分享 xff1a 第19篇 摘要 xff1a 最近和两位准备开发app的创业者聊天 xff0c 他们之前没有移动互联网的相关经验 xff0c 有的是想法和资金 他们在纠结 想快速开发app xff0c 需要找外包吗 xff1f 最近
  • 一种进制转换的特殊方法

    文章标题 一种进制转换的特殊方法 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 JDK 1 6 0

随机推荐

  • 从计算机的核心思想探讨一种进制转换的方法

    文章标题 从计算机的核心思想探讨一种进制转换的方法 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境
  • 用面向对象的思想探讨游戏“魔兽争霸”(1)

    文章标题 用面向对象的思想探讨游戏 魔兽争霸 xff08 1 xff09 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net new
  • 用面向对象的思想探讨游戏“魔兽争霸”(2)-继承和多态的应用(修改版)

    文章标题 用面向对象的思想探讨游戏 魔兽争霸 2 继承和多态的应用 修改版 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net ne
  • 改良用简单工厂模式构造的计算器代码—“反射”技术

    文章标题 改良用简单工厂模式构造的计算器代码 反射 技术 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程
  • 用面向对象的思想探讨游戏“魔兽争霸”(3)-模板模式的应用(修改版)

    文章标题 用面向对象的思想探讨游戏 魔兽争霸 3 模板模式的应用 修改版 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net new
  • 打造山寨产品和伪造产品的利器——装饰模式

    文章标题 打造山寨产品和伪造产品的利器 装饰模式 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 J
  • 信号中断 与 慢系统调用

    1 术语 1 1 慢系统调用 xff08 Slow system call xff09 该术语适用于那些可能永远阻塞的系统调用 永远阻塞的系统调用是指调用永远无法返回 xff0c 多数网络支持函数都属于这一类 如 xff1a 若没有客户连接
  • nodejs中处理回调函数的异常

    如果是使用nodejs 43 express3这个经典的组合 xff0c 那么有一种很方面的处理回调函数异常的方法 xff1a 1 安装模块 xff1a express domain middleware 2 加入如下的代码 xff1a a
  • 简单模拟Java中创建多线程的两种方法

    文章标题 简单模拟 Java 中创建多线程的两种方法 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境
  • 虚拟桌面技术的初步探讨

    文章标题 虚拟桌面技术的初步探讨 文章作者 newjueqi 作者邮箱 zengjiansheng1 64 126 com 作者QQ号 190678908 编写语言 VC 43 43 6 0 操作平台 XP SP2 作者声明 感觉到这是一种
  • 一个网游盗号木马的汇编源码分析

    文章标题 xff1a 一个网游盗号木马的汇编源码分析 文章作者 newjueqi 作者邮箱 zengjiansheng1 64 126 com 作者QQ号 190678908 使用工具 IDA 操作平台 XP SP2 作者声明 今年7月份学
  • miranda分析报告

    文章标题 miranda分析报告 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 作者声明 欢迎转载文章 xf
  • Java线程类小结(附思维导图)

    文章标题 Java 线程类小结 xff08 附思维导图 xff09 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjue
  • Java集合类小结(思维导图版)

    文章标题 Java 集合类小结 思维导图版 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 JDK
  • 简单文件分割合并器的Java实现

    文章标题 简单文件分割合并器的 Java 实现 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 JD
  • 层级菜单动态效果的实现

    文章标题 层级菜单动态效果的实现 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 Dreamweav
  • 简单实现邮件系统的界面功能

    文章标题 简单实现邮件系统的界面功能 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 Dreamwe
  • linux多线程编程书籍推荐:linux大牛之路从这几本书开始总结

    linux多线程编程是指基于Linux操作系统下的多线程编程 xff0c 包括多任务程序的设计 xff0c 并发程序设计 网络程序设计 xff0c 数据共享等 Linux系统下的多线程遵循POSIX线程接口 xff0c 称为pthread
  • 动态增加附件上传文件框的实现

    文章标题 动态增加附件上传文件框的实现 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 Dreamw
  • app后端设计(12)--图片的处理

    app上线后 xff0c 不断接受用户的反馈 xff0c 于是 xff0c 反馈非常差的情况下 xff0c 都会有app的改版 一旦app的改版 xff0c 都会有比较大的UI改动 xff0c 一改动UI xff0c 那么图片的尺寸也就必须