55. 【Android教程】位图:Bitmap

在上一节学习 Drawable 图像资源的时候我们在很多地方用到了 bitmap,bitmap 其实就是真实图片在 Android 中最直接的表现形式,这一节我们来仔细学习一下 Bitmap 的使用。

1. 什么是 Bitmap

Bitmap 在 Android 中对应一张图片文件,它是一个二位系统,通过编码记录了一张图片的完整形式。以左上角为原点,向右和向下建立一个(X , Y)坐标系,坐标系中的每一个点都成为一个“像素”。在不同编码格式的 Bitmap 里一个像素占的 bit 数有所不同,这些 bit 共同表征了当前像素的色值,可能是8 bit、16 bit 或者 24 bit 等等,最后将这些所有的色值组合起来就成了一张完整的原始图片。

我们在 Android 中绘制的一切图像都是一个 Bitmap,我们可以创建一个 Bitmap 示例或者使用 Bitamp 工具来修改、优化一个图像资源。

2. Bitmap 的常用 API

  • createBitmap(int width, int height, Bitmap.Config config):
    根据传入的宽高、创建一个可修改的 Bitmap 对象
  • createBitmap(DisplayMetrics display, int width, int height, Bitmap.Config config):
    相比上一个接口,这个可以在创建的时候传入一些参数
  • createBitmap(Bitmap src):
    根据传入的 Bitamp 创建一个新的 Bitamp
  • copy(Bitmap.Config config, boolean isMutable):
    将 Bitamp 对象的所有像素复制到一个新的 Bitmap 当中
  • extractAlpha():
    提取原始 Bitmap 的透明度并返回一个新的 Bitamp
  • getConfig():
    获取 Bitamp 的配置信息
  • getDensity():
    返回 Bitamp 的图片像素密度
  • getRowBytes():
    返回 Bitamp 图片的像素字节数组
  • setPixel(int x, int y, int color):
    设置图片的(x, y)坐标点上的色值
  • setDensity(int density):
    设置图片像素密度

3. 获取 Bitamp 实例

Android 提供了多种方法获取 Bitamp 实例,我们可以直接从 ImageView 上拿到当前设置的图片的 Bitamp 对象:

private Bitmap bmp;
private ImageView img;
img = (ImageView)findViewById(R.id.imageView);
BitmapDrawable  drawable = (BitmapDrawable)img.getDrawable();
bmp = drawable.getBitmap();

从上面的代码中也可以看到我们可以通过 Drawable 的getBitmap()方法从 Drawable 对象中提取出 Bitamp。
Android 还提供了一个 BitampFractory 工厂对象,专门让我们去获取 Bitmap 实例,主要有以下几种常用方法:

// 从资源文件中解码出 Bitmap
private Bitmap getBitmapFromResource(Resources res, int resId) {return BitmapFactory.decodeResource(res, resId);
}// 从图片文件中获取
private Bitmap getBitmapFromFile(String pathName) {return BitmapFactory.decodeFile(pathName);
}//  从像素数组中获取
public Bitmap Bytes2Bimap(byte[] b) {if (b.length != 0) {return BitmapFactory.decodeByteArray(b, 0, b.length);} else {return null;}
}// 读取输入流
private Bitmap getBitmapFromStream(InputStream inputStream) {return BitmapFactory.decodeStream(inputStream);
}

4. Bitmap 使用示例

通过这两节的学习,我们知道 Drawable 和 Bitmap 可以相互转换,接下来编写一个示例完成将 ImageView 中的 Drawable 对象保存到本地的示例程序。

4.1 MainActivity 截图功能

package com.emercy.myapplication;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class MainActivity extends Activity {static ByteArrayOutputStream byteOut = null;private Bitmap bitmap = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_cut = (Button) findViewById(R.id.button);btn_cut.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {capture();}});}public void capture() {Runnable action = new Runnable() {@Overridepublic void run() {final View contentView = getWindow().getDecorView();try {bitmap = Bitmap.createBitmap(contentView.getWidth(),contentView.getHeight(), Bitmap.Config.ALPHA_8);contentView.draw(new Canvas(bitmap));ByteArrayOutputStream byteOut = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteOut);save(bitmap);} catch (Exception e) {e.printStackTrace();} finally {try {if (null != byteOut)byteOut.close();if (null != bitmap && !bitmap.isRecycled()) {bitmap = null;}} catch (IOException e) {e.printStackTrace();}}}};try {action.run();} catch (Exception e) {e.printStackTrace();}}private void save(Bitmap b) {FileOutputStream fos;try {fos = new FileOutputStream("sdcard/short.png");boolean success = b.compress(Bitmap.CompressFormat.PNG, 80, fos);fos.flush();fos.close();if (success) {Toast.makeText(MainActivity.this, "截图完成", Toast.LENGTH_SHORT).show();}} catch (IOException e) {e.printStackTrace();}}
}

capture()方法中,我们获取当前 Activity 的“DecorView”(Activtiy 的顶层 View,我们设置的 CotentView 是其子 View),然后获取 DecorView 的输入流并会转化成 Bitmap,最后直接输出到文件中即可。

4.2 布局文件

这一节的布局文件可以任意,你可以尝试写出各种复杂的 UI 样式,因为上面的capture()方法是从“DecorView”中获取 Bitmap,所以无论你写了多少 View,最终都会通过setContentView()设置到“ContentView”中,而 ContentView 也是在 DecorView 中的,所以无论怎么写都逃离不开截图范围,最后记得加一个 Button 用于触发截屏。

5. 小结

本节进一步讲述了 Andorid 图像相关的内容,相比 Drawable,Bitmap 直接对应一张图片,更加具体。它可以与 Drawable 相互转化,并提供了多种 API 来直接操作一张图片,在做图片裁剪和修改的场景非常适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/7628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

普通人可以做什么兼职副业?推荐7 种卖情怀的生意,小众高利润

一瓶茅台,尽管成本仅为70元,但其建议零售价却高达1499元,而在市场上的流通价格更是突破了2600元大关。同样的一款手提包,在网络上仅售几百元,但一旦贴上了LV的标志,其售价便瞬间飙升至一万多元。这究竟是为…

【超好用的前端表单辅助功能】

前端表单辅助功能 1. 根据模块自动生成目录锚点定位2. 描点定位动态组件3. 隔离组件,组件内部实现校验逻辑,交给提交按钮统一处理4. 选择不同的类型需要重组不同的模块展示,并整合数据传给后端 最近做了一个复杂的表单,涉及到的技…

AI实景自动无人直播软件:引领直播行业智能化革命;提升直播效果,无人直播软件助力智能讲解

随着科技的快速发展,AI实景自动无人直播软件正在引领直播行业迈向智能化革命。它通过智能讲解、一键开播和智能回复等功能,为商家提供了更高效、便捷的直播体验。此外,软件还支持手机拍摄真实场景或搭建虚拟场景,使直播画面更好看…

43.WEB渗透测试-信息收集-域名、指纹收集(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:42.WEB渗透测试-信息收集-域名、指纹收集(4) web-架构资产收集&a…

蓝桥杯备赛(填空题)【Python B组】

一、弹珠堆放 问题描述 小蓝有 20230610 颗磁力弹珠,他对金字塔形状尤其感兴趣,如下图所示: (图是盗来的啊,侵权请联系删除) 问题分析 找规律,第一层1个,第二层3个,第…

UE5 audio capture 回声问题 ||在安卓上有爆鸣声

参考视频 0.基本步骤 【UE4_蓝图】录制麦克风声音/系统声音并输出保存WAV文件_ue4录音-CSDN博客 1.步骤 1.创建Sound Submix A 2. 右键新建Sound Submix B 3.把B的两个参数调为-96 4.audio capture的Base Submix,把前面提到的A赋值进去 5.开始录制输出和完成录制…

PXE远程部署CentOS系统

文章目录 在局域网内搭建PXE服务器PXE 启动组件PXE的优点实验一、搭建PXE服务器,实现远程部署CentOS系统环境准备server关闭防火墙安装组件准备 Linux 内核、初始化镜像文件及PXE引导文件配置启用TFTP 服务配置启动DHCP服务准备CentOS 7 安装源配置启动菜单文件 Cli…

突然断电,瀚高数据库启动失败

服务器临时断电后,数据库启动不起来 ps -ef|grep postgres 进到数据库的data目录下看下ls 看下 查看临时文件: ls -la /tmp 把这两个5866的文件改个名字张老师 加个bak就行 改完了pg_ctl start起一下

暗区突围联机不了联机失败无法联机的极速解决方法

暗区突围联机不了/联机失败/无法联机的极速解决方法 《暗区突围》是由腾讯魔方工作室群开发的第一人称射击类手游,于2021年8月17日进行先锋测试,并在2022年7月13日正式公测。《暗区突围》提供了双模式玩法,包括战术行动和伪装潜入&#…

猫咪没精神不吃饭?这招主食冻干喂养教你让猫咪恢复食欲

猫突然不吃东西没精神是生病了吗?当猫咪不吃东西、精神不振时,可能的原因有健康问题、环境因素或食物原因。首先应进行身体检查,观察是否有其他并发症,如无则可排除健康问题。还要给猫咪提供一个舒适的环境,多给它们一…

Cloudera简介和安装部署

ChatGPT Cloudera 是一个基于 Apache Hadoop 的数据管理和分析平台。它是由 Hadoop 的几位创始人及早期贡献者于 2008 年创立的公司,并随着公司的不断发展,Cloudera 开始提供企业级的解决方案,帮助企业更好地利用 Hadoop 生态系统进行大数据…

Qt QLCDNumber详解

1.简介 它提供了一个显示数字的显示屏控件,效果类似于现实世界中的液晶显示屏。它可以显示任何大小的数字。它可以显示十进制、十六进制、八进制或二进制数字。可以用setMode更改基数,用setSmallDecimalPoint更改小数点。 2.常用方法 以下是一些常用的…

基于点灯Blinker的ESP8266远程网络遥控LED

本文介绍基于ESP8266模块实现的远程点灯操作,手机侧APP选用的是点灯-Blinker,完整资料及软件见文末链接 一、ESP8266模块简介 ESP8266是智能家居等物联网场景下常用的数传模块,具有强大的功能,通过串口转WIFI的方式可实现远距离…

ElasticSearch知识点汇总

1、ES中的​​​​​​​倒排索引是什么。 倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典映射表即为倒排索引 2、ES是如何实现master选举的。 选举过程主要包括以下几个步骤: 心跳检测: 每个节点…

避雷!5.3分,新增1区被标记On Hold,共12本SCI/SSCI慎投!

本周投稿推荐 SSCI • 2/4区经管类,2.5-3.0(录用率99%) SCIE(CCF推荐) • 计算机类,2.0-3.0(最快18天录用) SCIE(CCF-C类) • IEEE旗下,1/2…

Linux系统编程 —— 进程概念,环境变量,虚拟地址空间总结(收藏向)

目录 一,什么是进程,有什么用? 1.1 关于进程 1.2 进程的重要特性 二,进程的描述:PCB结构体 2.1 关于PCB 2.2 task_struct 三,进程pid与ppid 3.1 pid是什么?怎么查看? 3.2 系…

淤地坝安全监测预警系统解决方案

一、方案背景 淤地坝是黄土高原地区人民群众长期同水土流失斗争实践中创造的一种行之有效的水土保持工程措施,在拦泥保土、减少入黄泥沙、防洪减灾、淤地造田、巩固退耕还林(草)、保障生态安全、促进粮食生产和水资源合理利用及经济社会稳定发…

计算机专业Python学习不再迷茫:一篇文章解锁所有知识点!

本文总结新手学Python,需要学习的核心知识点,是一份最精简的上手Python编程的学习指南。 Python作为一种流行的编程语言,以其简洁明了的语法和广泛的应用领域吸引了大量初学者。本文将为你提供一个Python入门指南,通过每个重要知…

多线程练习题

文章目录 卖票Thread线程类测试类运行结果 送礼物Thread线程类测试类运行结果 打印奇数数字Thread线程类测试类运行结果 抢红包Thread线程类测试类 抽奖箱Thread线程类测试类 卖票 Thread线程类 package demo1;public class Ticket extends Thread{public static int num100;O…

超详细——集成学习——Adaboost实现多分类——附代码

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器:效果好,模型复杂 弱学习器:效果不是很好,模型简单 优点 集成学习通过将多个学习器进行结合,常可获得比单一…