以前说过了 重叠部分图片合成,今天说一下

 canvas.drawBitmap拼接长图

先上效果gif

需求:多图拼接长图,长图大小 宽度为屏幕,高度自己不变形成比例

核心源码1.:

     final int mScreenWidth = getResources().getDisplayMetrics().widthPixels;LogUtil.log("mScreenWidth---" + mScreenWidth);new AsyncTask<List<String>, Void, Bitmap>() {@Overrideprotected void onPreExecute() {super.onPreExecute();showMyDialog();}@Overrideprotected Bitmap doInBackground(List<String>... lists) {List<String> list = lists[0];Bitmap last = null;for (int i = 0; i < list.size(); i++) {if (last == null) {last = PhotoUtils.comp(BitmapFactory.decodeFile(list.get(0)));} else {last = PhotoUtils.newBitmap(mScreenWidth, last, PhotoUtils.comp(BitmapFactory.decodeFile(list.get(i))));}}return last;}@Overrideprotected void onPostExecute(Bitmap bitmap) {dismissMyDialog();ivLong.setImageBitmap(bitmap);}}.execute(pathList);

1.压缩到不崩溃的加载质量

  //图片按比例大小压缩方法(根据Bitmap图片压缩)public static Bitmap comp(Bitmap image) {ByteArrayOutputStream baos = new ByteArrayOutputStream();image.compress(Bitmap.CompressFormat.JPEG, 100, baos);if (baos.toByteArray().length / 1024 > 1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出baos.reset();//重置baos即清空baosimage.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中}ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());BitmapFactory.Options newOpts = new BitmapFactory.Options();//开始读入图片,此时把options.inJustDecodeBounds 设回true了newOpts.inJustDecodeBounds = true;Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);newOpts.inJustDecodeBounds = false;int w = newOpts.outWidth;int h = newOpts.outHeight;//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为float hh = 800f;//这里设置高度为800ffloat ww = 480f;//这里设置宽度为480f//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可int be = 1;//be=1表示不缩放if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放be = (int) (newOpts.outWidth / ww);} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放be = (int) (newOpts.outHeight / hh);}if (be <= 0)be = 1;newOpts.inSampleSize = be;//设置缩放比例//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了isBm = new ByteArrayInputStream(baos.toByteArray());.       bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);return compressImage(bitmap);//压缩好比例大小后再进行质量压缩}//一、质量压缩法public static Bitmap compressImage(Bitmap image) {ByteArrayOutputStream baos = new ByteArrayOutputStream();image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中int options = 100;while (baos.toByteArray().length / 1024 > 100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩baos.reset();//重置baos即清空baosimage.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中options -= 10;//每次都减少10}ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片return bitmap;}

2.具体拼接方法基本原理(下面有进一步优化)

 public static Bitmap newBitmap(int width, Bitmap bit1, Bitmap bit2) {if (width <= 0) {return null;}int h1 =  bit1.getHeight() * width / bit1.getWidth();int h2 = bit2.getHeight() * width / bit2.getWidth();int height = h1 + h2; //缩放到屏幕宽度时候 合成后的总高度//创建一个空的Bitmap(内存区域),宽度等于第一张图片的宽度,高度等于两张图片高度总和Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//缩放到指定大小的新bitmapBitmap newSizeBitmap1 = getNewSizeBitmap(bit1, width, h1);Bitmap newSizeBitmap2 = getNewSizeBitmap(bit2, width, h2);//将bitmap放置到绘制区域,并将要拼接的图片绘制到指定内存区域Canvas canvas = new Canvas(bitmap);canvas.drawBitmap(newSizeBitmap1, 0, 0, null);canvas.drawBitmap(newSizeBitmap2, 0, h1, null);return bitmap;}

//进行优化后的合成方法

/*** 以第一个图为准* 优化算法  1.图片不需要铺满,只需要以统一合适的宽度。然后让imageview自己去铺满,不然长图合成长图会崩溃,这里以第一张图为例*2.只缩放不相等宽度的图片。已经缩放过的不需要再次缩放* @param bit1* @param bit2* @return*/
public static Bitmap newBitmap(Bitmap bit1, Bitmap bit2) {Bitmap newBit = null;int width = bit1.getWidth();if (bit2.getWidth() != width) {int h2 = bit2.getHeight() * width / bit2.getWidth();newBit = Bitmap.createBitmap(width, bit1.getHeight() + h2, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(newBit);Bitmap newSizeBitmap2 = getNewSizeBitmap(bit2, width, h2);canvas.drawBitmap(bit1, 0, 0, null);canvas.drawBitmap(newSizeBitmap2, 0, bit1.getHeight(), null);} else {newBit = Bitmap.createBitmap(width, bit1.getHeight() + bit2.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(newBit);canvas.drawBitmap(bit1, 0, 0, null);canvas.drawBitmap(bit2, 0, bit1.getHeight(), null);}return newBit;
}
    public static Bitmap getNewSizeBitmap(Bitmap bitmap, int newWidth, int newHeight) {float scaleWidth = ((float) newWidth) / bitmap.getWidth();float scaleHeight = ((float) newHeight) / bitmap.getHeight();// 取得想要缩放的matrix参数Matrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);// 得到新的图片Bitmap bit1Scale = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix,true);return bit1Scale;}

3.xml显示

    <ScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/iv_long"android:layout_width="match_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:scaleType="fitXY" /></FrameLayout></ScrollView>

android多图拼接长图并合理显示相关推荐

  1. android 照片拼接长图_android多图拼接长图并合理显示

    android多图拼接长图并合理显示 发布时间:2018-04-06 09:31, 浏览次数:541 , 标签: android 以前说过了 重叠部分图片合成,今天说一下 canvas.drawBit ...

  2. android 照片拼接长图_android多图拼接长图并合理显示-Go语言中文社区

    以前说过了 重叠部分图片合成,今天说一下canvas.drawBitmap拼接长图 先上效果gif 需求:多图拼接长图,长图大小 宽度为屏幕,高度自己不变形成比例 核心源码1.:final int m ...

  3. android 照片拼接长图_我才发现,微信里面有一个功能,能将手机照片自动拼成长图...

    微信朋友圈发图片有限制,一次只能发9张,超过就发送不了.那么喜欢拍照的朋友肯定肯定想一次性多分享几张,其实微信自带拼接长图功能,多张照片上传,就能变成一张长图,一次性在朋友圈分享几十张图片都可以. 微 ...

  4. android 照片拼接长图_手机照片拼接长图软件|照片拼接长图app下载v2.0-乐游网软件下载...

    <照片拼接长图app>是一款功能非常强大的微信照片拼接长图工具.名叫<照片拼贴>,能够直接为用户提供微信图片,QQ图片以及手机中的各种照片拼接和编辑的功能,让你随时随地拼图片, ...

  5. Golang PDF转图片 拼接长图 压缩PDF及图片 输出JPEG

    PDF转PNG主要是用到Xpdf的库 根据操作系统选择命令行工具下载- Download the Xpdf command line tools: 在bin64目录下可以找到PDFTOPNG可执行文件 ...

  6. Android 加载超大长图及原理

    Android 加载超大长图及原理 我们在开发中偶尔会遇到加载超大长图,类似于微信n多页聊天记录截图加载.但这类图片一般都会很大,几兆.十几兆.甚至几十兆,很容易造成内存溢出,今天笔者给大家提供一个可 ...

  7. android 照片拼接长图_最智能的 Android 长图拼接应用:图片自动连接

    点击「添加」图标,按拼接顺序勾选图片(免费版上限为 5 张),倘若不小心弄错了顺序,无需清除重新添加,可以通过按住图片拖动来进行排列.一切准备妥当之后,下一步就可以点击「连接!」来生成长图了. 生成的 ...

  8. android 照片拼接长图_Android拼接合并图片生成长图-阿里云开发者社区

    Android拼接合并图片生成长图 代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放. 假设根目录的Pict ...

  9. android 照片拼接长图_长图拼接app下载 长图拼接制作 for Android v2.6.1 安卓版 下载-脚本之家...

    长图拼接制作app是一款操作很方便的长截图拼接软件.长图拼接app能够支持对截图进行裁剪和编辑,长图拼接制作app还有多种拼接模板和框架供大家选择,有需要的用户赶快下载体验吧! 软件介绍 长图拼接制作 ...

  10. android中最新webview的功能,Android WebView实现截长图功能

    本文实例为大家分享了Android实现截长图功能的具体代码,供大家参考,具体内容如下 先看看手机自带的长截屏功能:  机型: vivo x9 plus 大胆推测实现逻辑: 1:需要一个可以滚动的Vie ...

最新文章

  1. 代码中配置log4j (同时输出不同级别的log到不同终端)
  2. Cisco路由器操作命令汇总,看完全学会
  3. python实现dns劫持_Python程序之DNS劫持
  4. 通过aws部署推荐系统_通过AWS Elastic Beanstalk轻松进行Spring Boot部署
  5. 硬件电路基础知识(30)---RS232、RS485、RS422、RJ45接口的区别
  6. 新手使用struts2,记一次struts2启动出错
  7. SpringBoot之日志记录 SLF4J(H)
  8. 为bootstrap+angularJs打造的表格代码生成器
  9. OpenGL vscode 安装与配置
  10. linux信任公钥的配置
  11. 《C语言及程序设计》程序阅读——数组与指针
  12. 中国姓氏大全(常见508个,罕见740个)
  13. Excel VBA VBA去重复的几种方法
  14. javaweb体育赛事网上售票系统
  15. React组件化开发
  16. cairo填充_cairo graphics 手册(2)
  17. PLC闪烁电路的实现
  18. python 列表乘一个数字
  19. 2018“人工智能”:是彻底复苏?还是起落轮回?| 抢票
  20. 自学做视频剪辑用什么软件,5款软件推荐总有一个是你想要的

热门文章

  1. 机房管理制度(试行)
  2. matlab接收端CRC校验编码,循环冗余校验码CRC文献综述和参考文献
  3. 2020-2022 抗疫营销案例合集(共17份)
  4. Oracle--CDB和PDB数据库的启动与关闭说明
  5. 打开 IBM Rational Rose Enterprise Edition 报错的处理
  6. 商家如何制作外卖小程序并且对接同城外卖配送平台?
  7. 网络互联课程设计(校园网和企业网)
  8. Windows设置自己的程序开机自动启动
  9. 写作之: 算法流程图latex代码和范例
  10. mdf文件修复工具 专业修复sql server数据库