当图像视图的缩放类型为fitCenter时,如果图片的尺寸超过4096*4096,App运行会崩溃。

若想解决加载超大图片的问题,有下列几种方案:

(1)在显示图片之前调用setLayerType方法,将图层类型设置为软件加速,此时系统会对该视图关闭硬件加速。

(2)把图像视图的缩放类型改为center,表示保持图片的原尺寸并居中显示。

(3)缩放类型保持fitCenter,同时事先缩小位图的尺寸,直至新位图的宽高均不超过4096。

权限:

    <!-- 相机 --><uses-permission android:name="android.permission.CAMERA" /><!-- 录音 --><uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- 存储卡读写 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><Buttonandroid:id="@+id/btn_choose"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="打开相册选取照片"android:textColor="@color/black"android:textSize="17sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"android:layout_marginLeft="5dp" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="缩放比率:"android:textColor="@color/black"android:textSize="17sp" /><Spinnerandroid:id="@+id/sp_scale"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:spinnerMode="dialog" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="旋转角度:"android:textColor="@color/black"android:textSize="17sp" /><Spinnerandroid:id="@+id/sp_rotate"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:spinnerMode="dialog" /></LinearLayout><ImageViewandroid:id="@+id/iv_photo"android:layout_width="match_parent"android:layout_height="200dp"android:scaleType="center" /></LinearLayout>

item_select.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="50dp"android:singleLine="true"android:gravity="center"android:textSize="17sp"android:textColor="#0000ff" />

代码:

package com.example.myapplication;import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
import com.example.myapplication.util.BitmapUtil;
import java.io.InputStream;public class MainActivity extends AppCompatActivity implements View.OnClickListener
{private final static String TAG = "ImageChangeActivity";private ImageView iv_photo; // 声明一个图像视图对象private Bitmap mBitmap; // 声明一个位图对象private Uri mImageUri; // 图片的路径对象private int CHOOSE_CODE = 3; // 选择照片的请求码private float mDegree; // 旋转角度private float mRatio; // 缩放比例@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv_photo = findViewById(R.id.iv_photo);findViewById(R.id.btn_choose).setOnClickListener(this);initScaleSpinner(); // 初始化缩放比率下拉框initRotateSpinner(); // 初始化旋转角度下拉框}@Overridepublic void onClick(View v) {if (v.getId() == R.id.btn_choose) {// 创建一个内容获取动作的意图(准备跳到系统相册)Intent albumIntent = new Intent(Intent.ACTION_GET_CONTENT);albumIntent.setType("image/*"); // 设置内容类型为图像startActivityForResult(albumIntent, CHOOSE_CODE); // 打开系统相册}}// 初始化缩放比率下拉框private void initScaleSpinner() {ArrayAdapter<String> scaleAdapter = new ArrayAdapter<String>(this,R.layout.item_select, scaleArray);Spinner sp_scale = findViewById(R.id.sp_scale);sp_scale.setPrompt("请选择缩放比率");sp_scale.setAdapter(scaleAdapter);sp_scale.setOnItemSelectedListener(new ScaleSelectedListener());sp_scale.setSelection(0);}private String[] scaleArray = {"1.0", "0.5", "0.2", "0.10", "0.05", "0.01"};class ScaleSelectedListener implements OnItemSelectedListener {public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {mRatio = Float.parseFloat(scaleArray[arg2]);showChangedImage(); // 显示变更后的图像}public void onNothingSelected(AdapterView<?> arg0) {}}// 初始化旋转角度下拉框private void initRotateSpinner() {ArrayAdapter<String> rotateAdapter = new ArrayAdapter<String>(this,R.layout.item_select, rotateArray);Spinner sp_rotate = findViewById(R.id.sp_rotate);sp_rotate.setPrompt("请选择旋转角度");sp_rotate.setAdapter(rotateAdapter);sp_rotate.setOnItemSelectedListener(new RotateSelectedListener());sp_rotate.setSelection(0);}private String[] rotateArray = {"0", "45", "90", "135", "180", "225", "270", "315"};class RotateSelectedListener implements OnItemSelectedListener {public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {mDegree = Integer.parseInt(rotateArray[arg2]);showChangedImage(); // 显示变更后的图像}public void onNothingSelected(AdapterView<?> arg0) {}}// 显示变更后的图像private void showChangedImage() {if (mBitmap != null) {// 获得缩放后的位图对象Bitmap bitmap = BitmapUtil.getScaleBitmap(mBitmap, mRatio);// 获得旋转后的位图对象bitmap = BitmapUtil.getRotateBitmap(bitmap, mDegree);iv_photo.setImageBitmap(bitmap); // 设置图像视图的位图对象}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {super.onActivityResult(requestCode, resultCode, intent);if (resultCode == RESULT_OK && requestCode == CHOOSE_CODE) {if (intent.getData() != null) { // 从相册选择一张照片mImageUri = intent.getData();// 打开指定uri获得输入流对象try (InputStream is = getContentResolver().openInputStream(mImageUri)) {// 从输入流解码得到原始的位图对象mBitmap = BitmapFactory.decodeStream(is);iv_photo.setImageBitmap(mBitmap); // 设置图像视图的位图对象} catch (Exception e) {e.printStackTrace();}Log.d(TAG, "uri.getPath="+mImageUri.getPath()+",uri.toString="+mImageUri.toString());}}}}

BitmapUtil

package com.example.myapplication.util;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.util.Log;
import java.io.InputStream;public class BitmapUtil
{private final static String TAG = "BitmapUtil";// 获得旋转角度之后的位图对象public static Bitmap getRotateBitmap(Bitmap bitmap, float rotateDegree){Matrix matrix = new Matrix(); // 创建操作图片用的矩阵对象matrix.postRotate(rotateDegree); // 执行图片的旋转动作// 创建并返回旋转后的位图对象return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);}// 获得比例缩放之后的位图对象public static Bitmap getScaleBitmap(Bitmap bitmap, double scaleRatio){int new_width = (int) (bitmap.getWidth() * scaleRatio);int new_height = (int) (bitmap.getHeight() * scaleRatio);// 创建并返回缩放后的位图对象return Bitmap.createScaledBitmap(bitmap, new_width, new_height, false);}// 获得自动缩小后的位图对象public static Bitmap getAutoZoomImage(Context ctx, Uri uri){Log.d(TAG, "getAutoZoomImage uri="+uri.toString());Bitmap zoomBitmap = null;// 打开指定uri获得输入流对象try (InputStream is = ctx.getContentResolver().openInputStream(uri)){// 从输入流解码得到原始的位图对象Bitmap originBitmap = BitmapFactory.decodeStream(is);int ratio = originBitmap.getWidth()/2000+1;// 获得比例缩放之后的位图对象zoomBitmap = BitmapUtil.getScaleBitmap(originBitmap, 1.0/ratio);}catch (Exception e){e.printStackTrace();}return zoomBitmap;}}

多媒体——图片——对图片进行简单加工相关推荐

  1. 3-综合案例:月福首页-多媒体-图片热点-框架

    1.开发网站的一个流程 业务员与客户进行沟通,包括:风格的.功能(论坛.留言板.支付.用户登录等) 业务员与美工沟通.制作网页效果图(首页.列表页.内容页) 制作人员开始切图排版,排成网页形式的 后台 ...

  2. 多媒体——图片——图像解码器ImageDecoder

    图像解码器ImageDecoder 早期的Android只支持三种图像格式:JPEG.PNG和GIF,而且图像视图仅能显示动图的初始画面,无法直接播放动画效果. 时代呼唤技术更先进的图像压缩算法,谷歌 ...

  3. 多媒体——图片——使用相机拍摄图片

    手机拍照的编码实现主要有两种:(1)通过Camera工具联合表面视图SurfaceView,由开发者实现拍照细节:(2)借助系统相机自动拍照,也就是跳到系统相机页面,由系统相机拍摄照片: Intent ...

  4. 多媒体——图片——从相册中选取图片

    系统相册既支持只选择一张图片,也支持同时选择多张图片. 跳到系统相册的代码例子如下: // 创建一个内容获取动作的意图(准备跳到系统相册) Intent albumIntent = new Inten ...

  5. mPaaS 3.0 多媒体组件发布 | 支付宝百亿级图片组件 xMedia 锤炼之路 (图片缓存篇)...

    一. 背景介绍 图片加载一直是 Android App 面临的"老大难"问题,加载速度与内存消耗天生就是一个矛盾统一体.我们依托支付宝超级 App 复杂的生态业务场景,借鉴业界领先 ...

  6. mPaaS 3.0 多媒体组件发布 | 支付宝百亿级图片组件 xMedia 锤炼之路 (图片缓存篇)... 1

    一. 背景介绍 图片加载一直是 Android App 面临的"老大难"问题,加载速度与内存消耗天生就是一个矛盾统一体.我们依托支付宝超级 App 复杂的生态业务场景,借鉴业界领先 ...

  7. 字符识别Python实现 图片验证码识别

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

  8. MD文件图片base64自动编码

    看工具链接请直接将文章拉到最后- 概述 不知道你在使用markdown写文章的时候有没有遇到过这样的烦恼, 文件写完了, 想将写完的文章粘贴到博客的时候, 你满心欢喜的复制粘贴, 但是发现图片根本复制 ...

  9. UEditor之基于Java图片上传前后端源码研究

    那么开始吧! 这是我的项目目录 1.从访问路径http://localhost:8081/Test/_examples/simpleDemo.html,我们主要是要看看,富文本框被加载出来之前,会调用 ...

最新文章

  1. javaweb学习总结(二十四):jsp传统标签开发
  2. 关于msi格式的程序包的安装
  3. 老司机如何找素材,如何找灵感?
  4. 早鸟票只剩3天丨为何一定要参加今年的CNCC?
  5. Python中断并继续
  6. FileUpload1.PostedFile.FileName取不到完整路径
  7. 协调器掉线,路由和终端节点的不同表现
  8. 经典编程题——回文问题
  9. 知乎 ”大家都见过哪些让你虎躯一震的代码?“用户“李晨昊”回答的等价代码
  10. Windows 7下如何删除OEM隐藏分区
  11. 世界人工智能大会倒计时30天,这些亮点不容错过
  12. 【CMake】CMake构建C++代码(一)
  13. SAP ECC 6.0 下载以及安装
  14. 创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求:12A 34B 56C 78D 依次类推
  15. 汽车电子控制器的硬件测试
  16. 如何选择产品经理课程?
  17. python 3.10.1 安装教程
  18. 普华永道区块链白皮书:区块链让城市更加智能 普华永道 中文精简版
  19. 关于桌面发布时报错Failed Read-only file system
  20. 网络营销常用的几种策略

热门文章

  1. 第一课:什么是树莓派
  2. 兰州大学计算机考研资料汇总
  3. 武汉大学计算机专业考研靠什么,武汉大学计算机技术考研科目有哪些?
  4. 阿里3年被裁,赔偿n+3,到手30多万!感谢阿里让我人生开挂!
  5. 学会自我赋能的五点(深度好文)
  6. [Unity2D/3D]实用的血条制作(第二期)
  7. linux-字体显示样式
  8. C语言初阶——5.字符串
  9. USACO——挤牛奶
  10. ue4物品审视功能及景深效果