精华内容
下载资源
问答
  • android 图片
    千次阅读
    2020-08-13 08:36:17
    /**
     * 将图片转换成Base64编码的字符串
     */
    public static String imageToBase64(String path){
        if(TextUtils.isEmpty(path)){
            return null;
        }
        InputStream is = null;
        byte[] data = null;
        String result = null;
        try{
            is = new FileInputStream(path);
            //创建一个字符流大小的数组。
            data = new byte[is.available()];
            //写入数组
            is.read(data);
            //用默认的编码格式进行编码
            result = Base64.encodeToString(data,Base64.DEFAULT);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(null !=is){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
        return result;
    }

     

     

    将Base64编码的字符串转换成图片
    /**
     * 将Base64编码转换为图片
     * @param base64Str
     * @param path
     * @return true
     */
    public static boolean base64ToFile(String base64Str,String path) {
        byte[] data = Base64.decode(base64Str,Base64.NO_WRAP);
        for (int i = 0; i < data.length; i++) {
            if(data[i] < 0){
                //调整异常数据
                data[i] += 256;
            }
        }
        OutputStream os = null;
        try {
            os = new FileOutputStream(path);
            os.write(data);
            os.flush();
            os.close();
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        }catch (IOException e){
            e.printStackTrace();
            return false;
        }
    }
    更多相关内容
  • 史上最简单Android图片轮播效果实现 源码程序

    千次下载 热门讨论 2015-08-28 12:07:00
    这个Android示例用最简单的方式实现了图片轮播效果,具体实现细节请阅读博文:http://blog.csdn.net/l1028386804/article/details/48049913
  • 因为android经常使用到添加图片功能,每次自己写都太麻烦,再加上动态权限的获取,非常容易弄混出错,所以整理一下,以后都这么用,慢慢熟悉。 1、图片选择框架用知乎的 Matisse GitHub - zhihu/Matisse: A well-...

    因为android经常使用到添加图片功能,每次自己写都太麻烦,再加上动态权限的获取,非常容易弄混出错,所以整理一下,以后都这么用,慢慢熟悉。

    1、图片选择框架用知乎的 Matisse

    GitHub - zhihu/Matisse: A well-designed local image and video selector for Android

    Matisse 知乎图片选择框架 - 简书

    2、动态权限申请用 XmPermissions

    GitHub - lhm0603/XmPermissionsProject: Android动态权限申请框架

    Android动态权限申请框架_h461415832的博客-CSDN博客_android 权限申请框架

    注意事项 : Matisse 需要自己额外再配置provider ,还要自己引入glide依赖,在调用拍照功能的时候 ,用如下方法

    MediaStoreCompat mediaStoreCompat = new MediaStoreCompat(MainActivity.this);
    mediaStoreCompat.setCaptureStrategy(new CaptureStrategy(true, "PhotoPicker"));//自己设置的provider属性
    mediaStoreCompat.dispatchCaptureIntent(MainActivity.this, 2016);
    Uri currentPhotoUri = mediaStoreCompat.getCurrentPhotoUri();
    String currentPhotoPath = mediaStoreCompat.getCurrentPhotoPath();
    Log.d("lol", "onClick: currentPhotoUri   " + currentPhotoUri);
    Log.d("lol", "onClick: currentPhotoPath   " + currentPhotoPath);
    //uri 和 path 都能用
    Glide.with(MainActivity.this).load(currentPhotoPath).into(imageView);

    不要从 onActivityResult 方法里拿data ,因为data里是空的,这是因为拍照时,提前创建了jpg文件,只是把照片内容保存在已经创建好的文件里,而不是把图片文件作为data返回。(如果按照一般模式,把图片作为data返回,图片会被压缩,变得很模糊)

    展开全文
  • Android图片选择器PhotoPicker

    千次阅读 2020-04-30 12:07:39
    android图片选择器,适配Android11文件权限

    前言

    维护的一个项目的时候发现,项目使用了一个5年前的库,是通过直接拉源码的并改写的方式来实现的。去GitHub找到了这个库PhotoPicker。作者说项目不维护了,建议大家使用zhihu/Matisse。想着换库可能比直接改要麻烦,我就改了下这个库,上传到GitHub自己用了。

    分析一下需要注意的地方

    • Glide版本过老,需要升级。
    • target api修改成29,在androidx下要能正常使用。
    • android 7.0的url适配,需要使用FileProvider,设置authority字段。
    • 有需要上传图片文件的情况,在获取不到绝对路径的时候,可以使用uri获取文件流然后上传。
    • 有些方法和字段过时:在10.0的机子上,通过 MediaStore.Images.Media.DATA字段获取不到图片的路径;api29之前,拍照过后通常是使用广播的形式通知MediaStore刷新,图库才能显示出图片,在29之后使用MediaScannerConnection的api扫描。

    使用

    工程目录下gradle文件添加jitpack依赖:

    allprojects {
        repositories {
            google()
            mavenCentral()
            gradlePluginPortal()
            maven { url "https://jitpack.io" }
        }
    }
    

    添加权限AndroidManifest.xml

     	<uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.CAMERA" />
    

    sample使用了第三方库九宫格,添加依赖如下(本库也支持单选,请根据自己情况而定)

    dependencies {
    	//此处省略...
    	
        //9宫格的图片选择
        implementation 'com.jaeger.ninegridimageview:library:1.1.1'
    	
    	//本地库依赖
        //implementation project(':photopicker')
        //远程依赖
        implementation 'com.github.PengHaiZhuo:PhotoPicker:1.0.4'
    }
    

    使用

        /**
         * 当前选择的图片路径
         */
        private ArrayList<String> imagePathsList = new ArrayList<>();
    	/**
         * 允许上传照片最大数量
         */
        private static final int INT_MAXSIZE_IMG = 9;
        
        /**
         * 跳转到图片选择器
         * @param position:预览图片需要传当前图片位置,配合imagePathsList使用
         * @param isPick 是否是添加图片
         */
        private void toPickPhoto(int position,boolean isPick){
            if (isPick) {
                PickImageIntent intent = new PickImageIntent(mContext);
                //设置为多选模式
                intent.setSelectModel(SelectMode.MULTI);
                // 是否拍照
                intent.setIsShowCamera(true);
                //设置最多选择照片数量
                if (imagePathsList.size() > 0 && imagePathsList.size() < (INT_MAXSIZE_IMG + 1)) {
                    // 最多选择照片数量
                    intent.setSelectedCount(INT_MAXSIZE_IMG + 1 - imagePathsList.size());
                } else {
                    intent.setSelectedCount(0);
                }
                /*// 已选中的照片地址,用于回显选中状态
                intent.setSelectedPaths(imagePathsList);*/
                startActivityForResult(intent, REQUEST_CAMERA_CODE);
            } else {
            	//预览图片
                PreViewImageIntent intent = new PreViewImageIntent(mContext);
                intent.setCurrentItem(position);
                intent.setPhotoPaths(imagePathsList);
                startActivityForResult(intent, REQUEST_PREVIEW_CODE);
            }
        }
    

    重写onActivityResult方法,获取选择的照片路径列表

    	private static final int REQUEST_CAMERA_CODE = 10;
        private static final int REQUEST_PREVIEW_CODE = 20;
         @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode==RESULT_OK){
                switch (requestCode) {
                    case REQUEST_CAMERA_CODE:
                        if (data != null) {
                            ArrayList<String> list = data.getStringArrayListExtra(ImagePickerConstract.EXTRA_RESULT);
                            //todo 显示图片
                        }
                        break;
                    case REQUEST_PREVIEW_CODE:
                        if (data != null) {
                            ArrayList<String> ListExtra = data.getStringArrayListExtra(ImagePickerConstract.EXTRA_RESULT);
                            if (imagePathsList != null) {
                                imagePathsList.clear();
                            }
                            imagePathsList.addAll(ListExtra);
                            //todo 预览里可能删除了图片,所以需要更新显示的图片
                        }
                        break;
                }
            }
        }
    

    部分截图

    图片选择

    可以选择文件夹中文件也可以拍照。
    在这里插入图片描述

    预览

    使用了PhotoView控件,可放大缩小查看图片
    在这里插入图片描述

    9宫格

    在这里插入图片描述
    2021-12月21提交了1.0.4版,处理如下

    • 因为jcenter库关了,修改了配置文件
    • 通过Context访问自己的私有目录,不需要读写权限,不管什么系统版本
    • android11必须进行文件权限适配!在android11,通过内容提供者扫描很多文件扫不出来,能扫出来的只有那些DCIM、Download这种有权限的
    • android 10是谷歌给开发者们的一个过渡版本,只需要在配置文件的application节点设置android:requestLegacyExternalStorage="true"即可不做文件权限适配。可以在sd卡创建乱七八糟的文件,可以通过内容提供者扫描出公有目录各种文件
    • 关于绝对路径,很多情况下获取不到,所以能拿到uri的话,请通过输入输出流处理,比如转成bitmap或者保存到公有目录Download这种目录下

    已完成Android11文件权限适配,记录如下

    1. 无外部可操作存储,拍照文件保存目录默认在/data/data/< package name >/files/<app name>/images
    2. 有外部可操作存储,拍照文件存放目录在Android11前后发生变化,Android11之前在/mnt/sdcard/<app name>/images ,Android11之后在/mnt/sdcard/Android/data/< package name >/<app name>/images
    3. 媒体文件扫描在Android11前后发生变化,android11之前会按照媒体上一级目录显示分类,android11之后只有一个media目录
    4. 拍照后通知gallery刷新的方式发生了变更

    在这里插入图片描述

    2021-12-22补充示例:在Android10上通过内容提供者保存文件到公有目录

    val context = this@MainActivity
    val fileName = "p-touch.pdf"
    val subFileName="phz"
    val pdfUrl =
        "https://download.brother.com/welcome/docp000648/cv_pt3600_schn_sig_lad962001.pdf"
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        savePDFUsingMediaStore(context, pdfUrl, fileName,subFileName)
    } else {//android 10以前随便存,不过要记得获取读写权限
        val file = File(Environment.getExternalStorageDirectory(),subFileName)
        //val contentUri = getUriForFile(context, “配置文件中FileProvider设置的authorities字段”, file)
        //文件存在 sd卡/<subFileName>/<fileName>
        val target = File(file, fileName)
        URL(pdfUrl).openStream().use { input ->
            FileOutputStream(target).use { output ->
                input.copyTo(output)
            }
        }
    }
    

    保存pdf

    @RequiresApi(Build.VERSION_CODES.Q)
    private fun savePDFUsingMediaStore(context: Context, url: String, fileName: String,subFileName:String) {
        val contentValues = ContentValues().apply {
            put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
            put(MediaStore.MediaColumns.MIME_TYPE, "application/pdf")
            put(MediaStore.Downloads.DATE_ADDED, (System.currentTimeMillis() / 1000).toInt())
            put(MediaStore.Downloads.RELATIVE_PATH,Environment.DIRECTORY_DOWNLOADS + File.separator + subFileName            )
        }
        val resolver = context.contentResolver
        //文件存在sd卡/Download/<subFileName>/<fileName>
        //uri打印 content://media/external/downloads/<id>
        val uri = resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)
        uri?.let {
            lifecycleScope.launch(Dispatchers.IO) {
                URL(url).openStream().use { input ->
                    resolver.openOutputStream(uri).use { output ->
                        input.copyTo(output!!, DEFAULT_BUFFER_SIZE)
                    }
                }
            }
        }
    }
    

    Demo地址

    可参照:SampleDemo

    展开全文
  • Android 图片压缩的三种方法

    千次阅读 2020-09-02 16:42:50
    随着Android手机的越来越先进,摄像头也越来越清晰,但是给我们开发者而言传递的图片也是越来越大,这个时候我们可以对一些没有必要原图展示的图片进行压缩,今天分享下常用的三种方法 第一种,大小压缩 第二种,...

    随着Android手机的越来越先进,摄像头也越来越清晰,但是给我们开发者而言传递的图片也是越来越大,这个时候我们可以对一些没有必要原图展示的图片进行压缩,今天分享下常用的三种方法

    第一种,大小压缩

      public void bitmapFactory(Uri imageUri){
            String[] filePathColumns = {MediaStore.Images.Media.DATA};
            Cursor c = getContentResolver().query(imageUri, filePathColumns, null, null, null);
            c.moveToFirst();
            int columnIndex = c.getColumnIndex(filePathColumns[0]);
            String imagePath = c.getString(columnIndex);
            c.close();
    
            // 配置压缩的参数
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true; //获取当前图片的边界大小,而不是将整张图片载入在内存中,避免内存溢出
            BitmapFactory.decodeFile(imagePath, options);
            options.inJustDecodeBounds = false;
            inSampleSize的作用就是可以把图片的长短缩小inSampleSize倍,所占内存缩小inSampleSize的平方
            options.inSampleSize = caculateSampleSize(options,500,50);
            Bitmap bm = BitmapFactory.decodeFile(imagePath, options); // 解码文件
            imageView.setImageBitmap(bm);
        }
    
        /**
         * 计算出所需要压缩的大小
         * @param options
         * @param reqWidth  我们期望的图片的宽,单位px
         * @param reqHeight 我们期望的图片的高,单位px
         * @return
         */
        private int caculateSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
            int sampleSize = 1;
            int picWidth = options.outWidth;
            int picHeight = options.outHeight;
            if (picWidth > reqWidth || picHeight > reqHeight) {
                int halfPicWidth = picWidth / 2;
                int halfPicHeight = picHeight / 2;
                while (halfPicWidth / sampleSize > reqWidth || halfPicHeight / sampleSize > reqHeight) {
                    sampleSize *= 2;
                }
            }
            return sampleSize;
        }
    

    第二种,质量压缩

    /**
         * 这里我们生成了一个Pic文件夹,在下面放了我们质量压缩后的图片,用于和原图对比
         * 压缩图片使用Bitmap.compress(),这里是质量压缩
         */
        public void bitmapCompress(Uri uriClipUri) {
            try {
                //裁剪后的图像转成BitMap
                //photoBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uriClipUri));
                photoBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uriClipUri);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //创建路径
            String path = Environment.getExternalStorageDirectory()
                    .getPath() + "/Pic";
            //获取外部储存目录
            file = new File(path);
            //创建新目录, 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
            file.mkdirs();
            //以当前时间重新命名文件
            long i = System.currentTimeMillis();
            //生成新的文件
            file = new File(file.toString() + "/" + i + ".png");
            Log.e("fileNew", file.getPath());
            //创建输出流
            OutputStream out = null;
            try {
                out = new FileOutputStream(file.getPath());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            //压缩文件,返回结果,参数分别是压缩的格式,压缩质量的百分比,输出流
            boolean bCompress = photoBitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);
    
            try {
                photoBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(),Uri.fromFile(file));
            } catch (IOException e) {
                e.printStackTrace();
            }
            imageView.setImageBitmap(photoBitmap);
        }
    

    第三种,三方框架压缩

      //图片压缩
        implementation 'me.shouheng.compressor:compressor:1.3.0'
    
     override fun getImages(file: File, mContext: Context) {
            Compress.with(mContext, file)
                .strategy(Strategies.compressor())
                .setConfig(Bitmap.Config.ARGB_8888)
                .setMaxHeight(1280f)
                .setMaxWidth(720f)
                .setScaleMode(ScaleMode.SCALE_WIDTH)
                .asFlowable()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    //压缩成功 获取file文件
                }, {
                 	//压缩失败
                })
    
    
        }
    
    注:其实根本来说框架里的也无非是上面的两种方法压缩,只是图片处理的更为完善,内存异常控制的也非常好,使用起来也非常简便,既然有轮子,咱们大家没有必要自己造轮子了吧,当然nb的小伙伴也可以自己写一个,大家一起分享下
    展开全文
  • android图片尺寸大小设置

    万次阅读 2018-08-17 10:19:45
    方法一:(按照图片尺寸设置、方法中viewRootBanner为图片或者装载图片的控件banner) 例如:750*286尺寸 的图片 //设置图片宽高比 float scale = (float) 750 / (float) 286; int screenWidth; //获取屏幕的...
  • Android图片的手动放大缩小

    万次阅读 多人点赞 2019-02-09 20:36:24
    利用缩放因子进行图片的放大缩小,效果图如下 在实现过程中如出现直接崩溃的情况:在全局配置文件中加入android:largeHeap=&amp;quot;true&amp;quot;即可解决问题,在文章最后有现成代码 步骤: 1.布局文件...
  • Android图片上传(头像裁切+原图原样)

    千次下载 热门讨论 2015-01-18 15:25:03
    Android图片上传(头像裁切+原图原样) http://blog.csdn.net/geofferysun/article/details/42835669
  • Android 图片浏览全屏缩放

    千次下载 热门讨论 2014-05-10 23:18:39
    高仿现在主流的图片浏览的全屏缩放效果。如QQ好友动态、微信朋友圈。
  • Android 图片、视频播放器

    热门讨论 2014-05-17 11:11:33
    Android 图片、视频播放器源码, 实现图片浏览、放大和切换,支持视频播放,效果很炫。里面有效果图
  • android 图片凸出

    千次阅读 2016-07-29 14:51:19
    今天有个群友问 android 图片凸出 效果怎么弄,早以前有过类似的需求,整个项目的提示框都是一个背景,背景上方有凸出半张图片,所以用layer-list写了一个背景来实现。 补上clipChildren属于也可以搞定。 思路 ...
  • Android常用图片处理 : 1.url图片地址转base64 想要将图片地址转成base64格式,需要先将其转为Bitmap,然后再有Bitmap转为base64,使用下面2和3 2.url转Bitmap 由于是通过地址获取图片,所以在转换的过程中...
  • Android 图片文件读取

    万次阅读 多人点赞 2015-05-14 22:32:43
    介绍图片文件读取所涉及到的各项技术点
  • Android图片太大导致无法正常显示

    千次阅读 2018-04-24 11:31:40
    Android图片太大导致无法正常显示原因安卓中有个内存的限制,超过这个限制后资源是无法显示的解决办法在全局配置文件中进行对内存的配置【关键:android:largeHeap="true"】&lt;?xml version="...
  • android图片不同分辨率适配

    万次阅读 2018-07-17 15:19:27
    dpi(Dots Per Inch):每英寸的像素点数量 dp(density-independent pixel):密度无关像素,当dpi为160时,1...图片的规格:px*px,比如270*480像素的图片  android使用匹配机制用到dpi这个参数,无论是什么手...
  • 图片旋转的方法有两种(旋转ImageView所在布局暂不考虑),这两种分别是动画和使用Matrix(齐次变换矩阵)。  我们想要达到的目标是旋转长图(非正方形),甚至长宽比例很夸张那种。想达到的效果是以图片中心为原点旋转,...
  • android图片处理:让图片一直匀速旋转

    万次阅读 多人点赞 2016-08-10 20:19:39
    图片匀速旋转
  • 今天看了今日头条APP的图片查看的效果,就自己实现了一下。效果如下首先引入两个库一个是图片缩放的功能:PhotoView框架compile 'com.github.chrisbanes:PhotoView:1.2.6'一个界面滑动退出效果(比如自己滑动空白...
  • 性能优化——Android图片压缩与优化的几种方式

    万次阅读 多人点赞 2018-05-17 23:50:28
    图片优化压缩方式大概可以分为以下几类:更换图片格式,质量压缩,采样率压缩,缩放压缩,调用jpeg压缩等1、设置图片格式Android目前常用的图片格式有png,jpeg和webp,png:无损压缩图片格式,支持Alpha通道,...
  • Android 图片移动和拖动

    千次阅读 2017-06-10 00:16:03
    Android 图片移动和拖动移动图片实现方式:利用点击两个按钮(left和right)来操纵图片向左向右的移动。界面要使得图片可以移动,要使用“RelativeLayout” activity_main:将图片文件储存到drawable文件夹中,该示例...
  • Android图片加载框架Picasso最全使用教程 一 Android图片加载框架Picasso最全使用教程 二 Android图片加载框架Picasso最全使用教程 三 Android图片加载框架Picasso最全使用教程 四 Android图片加载框架Picasso...
  • 本文转载,本人收藏用,代码仅供参考 一、图片质量压缩 /** * 质量压缩方法 * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArray
  • 此为示例代码,详细讲解请参考 http://blog.csdn.net/sinyu890807/article/details/8796877
  • 【Android开发经验】FaceBook推出的Android图片加载库-Fresco   欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章 原文链接:...
  • Android 图片渐变切换效果

    千次阅读 2017-01-03 11:23:56
    package ... import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.support.v7.app.AppCompatActivity; import android.o...
  • Android图片添加标签:Android-PictureTagView 在一些社交类、美图类的Android APP中,会给用户提供一项功能就是给图片添加一些标签,这种功能需求可以使用一个在githubs上的第三方的开源库Android-PictureTagView...
  • Android 图片旋转动画两种实现方式

    千次阅读 2017-08-01 11:12:58
    说明:让图片旋转两种方法,使用xml和代码xml加载:xml布局:anim_rotate.xml &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;rotate xmlns:android="...
  • 2、可对图片进行旋转、缩放 3、能左右滑动,预览其他图片 4、单击预览界面后,回到上一界面 具体如下图:   使用到的第三方库 1、图片加载缓存库 Picasso:https://github.com/square/picasso 2、图片浏览...
  • 最全的android图片加密

    万次阅读 2015-12-02 14:53:41
    android开发过程中有些时候一些重要的图片,我们不希望用户通过文件管理直接能查看,我们该怎么办呢,当然你可以把图片放在android的内部存储中,data/data/下,但毕竟android root用户一大堆,还是解决不了问题。...
  • Android图片放大再还原的动画

    千次阅读 2017-05-05 17:57:30
    Android 动画 scale标签

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 552,960
精华内容 221,184
关键字:

android 图片