直播平台搭建,Android手机拍照和手机相册选取图片的工具
直播平台搭建,Android手机拍照和手机相册选取图片的工具
1 | package com.shentaiwang.jsz.savepatient.util;<br> <br>import android.app.Activity;<br>import android.content.ContentValues;<br>import android.content.Context;<br>import android.content.Intent;<br>import android.database.Cursor;<br>import android.graphics.Bitmap;<br>import android.graphics.BitmapFactory;<br>import android.graphics.Canvas;<br>import android.graphics.Matrix;<br>import android.graphics.Paint;<br>import android.graphics.PorterDuff;<br>import android.graphics.PorterDuffXfermode;<br>import android.graphics.Rect;<br>import android.graphics.RectF;<br>import android.net.Uri;<br>import android.os.Environment;<br>import android.provider.MediaStore;<br>import android.util.DisplayMetrics;<br>import android.util.Log;<br>import android.view.WindowManager;<br>import android.widget.Toast;<br> <br>import java.io.BufferedOutputStream;<br>import java.io.ByteArrayOutputStream;<br>import java.io.File;<br>import java.io.FileNotFoundException;<br>import java.io.FileOutputStream;<br>import java.io.IOException;<br>import java.text.SimpleDateFormat;<br>import java.util. Date ;<br>import java.util.Locale;<br> <br> /**<br> * Created by user on 2016/12/16.<br> */ <br> public class ImageUtil {<br> public static final int CODE_SETHDIMG_ALNUM = 1;<br> public static final int CODE_SETHDIMG_CAM = 2;<br> public static final int CROP_IMG = 100;<br> <br> public File camImgFile = null;<br> public File cropImgFile = null;<br> <br> public void gotoCam(Context context) {<br> try {<br> //获取当前系统的android版本号<br> int currentApiVersion = android.os.Build.VERSION.SDK_INT;<br> <br> SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());<br> String str = dateFormat.format(new Date(System.currentTimeMillis()));<br> <br> //设置保存拍摄照片路径(DCIM/Camera/Modle_PictureWall_img_20170212_122223.jpg)<br> //路径默认,若修改则不能保存照片<br> camImgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "/Camera/Modle_PictureWall_img_" + str + ".jpg");<br> <br> Uri outputImgUriFromCam = null;<br> if (currentApiVersion < 24) {<br> outputImgUriFromCam = Uri.fromFile(camImgFile);<br> } else {<br> ContentValues contentValues = new ContentValues(1);<br> contentValues.put(MediaStore.Images.Media.DATA, camImgFile.getAbsolutePath());<br> <br> outputImgUriFromCam = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);<br> <br> }<br> <br> //跳转到照相机拍照<br> Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);<br> it.putExtra(MediaStore.EXTRA_OUTPUT, outputImgUriFromCam);<br> <br> ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_CAM);<br>// startActivityForResult(it,CODE_SETHDIMG_CAM);<br> }catch (Exception e){<br> Toast.makeText(context,"请开启摄像权限",Toast.LENGTH_SHORT).show();<br> }<br> }<br> <br> <br> public void gotoAlbum(Context context) {<br> Intent it = new Intent(Intent.ACTION_PICK,<br> android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);<br> <br> ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_ALNUM);<br>// startActivityForResult(it,CODE_SETHDIMG_ALNUM);<br> }<br> <br> public void cropImg(Context context, boolean isFromCam, boolean isSetHd, Intent data, String fileName) {<br> File inputFile = null;<br> <br> if (isFromCam) {<br> inputFile = camImgFile;<br> } else {<br> Log.d("ImageUtil", "cropImg:图片数据: "+data.getData());<br> inputFile = new File(getRealPathFromURI(context, data.getData()));<br> }<br> <br> //设置保存路径名称<br> cropImgFile = new File(context.getExternalFilesDir(fileName), String.valueOf(System.currentTimeMillis()));<br> <br> WindowManager manager = ((Activity) context).getWindowManager();<br> DisplayMetrics outMetrics = new DisplayMetrics();<br> manager.getDefaultDisplay().getMetrics(outMetrics);<br> <br> Intent it = new Intent("com.android.camera.action.CROP");<br> it.setDataAndType(getImageContentUri(context, inputFile), "image/*");<br> <br> it.putExtra("output", Uri.fromFile(cropImgFile));<br> it.putExtra("crop", "true");<br> it .putExtra("scale",true);//黑边<br> it .putExtra("scaleUpIfNeeded",true);//黑边<br> <br> <br> if (isSetHd) {<br> // 裁剪框比例<br> it.putExtra("aspectX", 1);<br> it.putExtra("aspectY", 1);<br> <br> // 输出图片大小<br> it.putExtra("outputX", outMetrics.widthPixels / 2);<br> it.putExtra("outputY", outMetrics.widthPixels / 2);<br> } else {<br> // 裁剪框比例<br> it.putExtra("aspectX", 3);<br> it.putExtra("aspectY", 2);<br> <br> // 输出图片大小<br> it.putExtra("outputX", 600);<br> it.putExtra("outputY", 400);<br> }<br> <br> // 返回格式<br> it.putExtra("outputFormat", "JPEG");<br> <br> ((Activity) context).startActivityForResult(it, CROP_IMG);<br>// startActivityForResult(it, CROP_IMG);<br> }<br> <br> public String getRealPathFromURI(Context context, Uri uri) {<br> String mImgPath;<br> String[] filePathColumn = {MediaStore.Images.Media.DATA};<br> <br> Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);<br> if(cursor!=null){<br> cursor.moveToFirst();<br> int columnIndex = cursor.getColumnIndex(filePathColumn[0]);<br> String picturePath = cursor.getString(columnIndex);<br> cursor.close();<br> mImgPath=picturePath;<br> }else{<br> mImgPath=uri.getPath();<br> }<br> return mImgPath;<br> <br> <br> <br> }<br> <br> public Uri getImageContentUri(Context context, File imageFile) {<br> String filePath = imageFile.getAbsolutePath();<br> Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{"_id"}, "_data=? ", new String[]{filePath}, (String) null);<br> if (cursor != null && cursor.moveToFirst()) {<br> int values1 = cursor.getInt(cursor.getColumnIndex("_id"));<br> Uri baseUri = Uri.parse("content://media/external/images/media");<br> return Uri.withAppendedPath(baseUri, "" + values1);<br> } else if (imageFile.exists()) {<br> ContentValues values = new ContentValues();<br> values.put("_data", filePath);<br> return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);<br> } else {<br> return null;<br> }<br> }<br> <br> public void refreshAlbum(Context context, String path) {<br> context.sendBroadcast(new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE", Uri.parse("file://" + path)));<br> }<br> <br> <br> public static byte[] bitmap2Bytes(Bitmap bm) {<br> ByteArrayOutputStream baos = new ByteArrayOutputStream();<br> bm.compress(Bitmap.CompressFormat.PNG, 100, baos);<br> return baos.toByteArray();<br> }<br> <br> /**<br> * 根据byte数组生成文件<br> *<br> * @param bytes 生成文件用到的byte数组<br> */<br> public static boolean createFileWithByte(byte[] bytes) {<br> String fileName = "portrait.png";<br> <br> <br> // TODO Auto-generated method stub<br> /**<br> * 创建File对象,其中包含文件所在的目录以及文件的命名<br> *<br> */<br> if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断SDCard进行操作<br> //获取SDCard指定目录下<br> String sdCardDir = Environment.getExternalStorageDirectory() + "/CropImage/";<br> File dirFile = new File(sdCardDir);//目录转换成文件夹<br> if (!dirFile.exists()) {//如果不存在,就建立这个文件夹<br> dirFile.mkdir();<br> }<br> File file = new File(sdCardDir, fileName);<br> // 创建FileOutputStream对象<br> FileOutputStream outputStream = null;<br> // 创建BufferedOutputStream对象<br> BufferedOutputStream bufferedOutputStream = null;<br> try {<br> // 如果文件存在则删除<br> if (file.exists()) {<br> file.delete();<br> }<br> // 在文件系统中根据路径创建一个新的空文件<br> file.createNewFile();<br> // 获取FileOutputStream对象<br> outputStream = new FileOutputStream(file);<br> // 获取BufferedOutputStream对象<br> bufferedOutputStream = new BufferedOutputStream(outputStream);<br> // 往文件所在的缓冲输出流中写byte数据<br> bufferedOutputStream.write(bytes);<br> // 刷出缓冲输出流,该步很关键,要是不执行flush()方法,那么文件的内容是空的。<br> bufferedOutputStream.flush();<br> } catch (Exception e) {<br> // 打印异常信息<br> e.printStackTrace();<br> } finally {<br> // 关闭创建的流对象<br> if (outputStream != null) {<br> try {<br> outputStream.close();<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> }<br> if (bufferedOutputStream != null) {<br> try {<br> bufferedOutputStream.close();<br> } catch (Exception e2) {<br> e2.printStackTrace();<br> }<br> }<br> }<br> return true;<br> }<br> return false;<br> <br> }<br> <br> /**<br> * 获取文件路径并转换成Bitmap<br> *<br> * @param filepath<br> * @return<br> */<br> public static Bitmap getFilePath(String filepath) {<br> File file = new File(filepath);<br> Bitmap bm = null;<br> if (file.exists()) {<br> bm = BitmapFactory.decodeFile(filepath);<br> }<br> return bm;<br> }<br> <br> public static Bitmap Bytes2Bitmap(byte[] bytes) {<br> if (bytes.length != 0) {<br> return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);<br> } else {<br> return null;<br> }<br> }<br> <br> public static Bitmap toRoundCorner(Bitmap bitmap, float ratio) {//把正方形图片转化为圆形,ratio为2<br> Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),<br> bitmap.getHeight(), Bitmap.Config.ARGB_8888);<br> Canvas canvas = new Canvas(output);<br> final Paint paint = new Paint();<br> final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());<br> final RectF rectF = new RectF(rect);<br> paint.setAntiAlias(true);<br> canvas.drawARGB(0, 0, 0, 0);<br> canvas.drawRoundRect(rectF, bitmap.getWidth() / ratio,<br> bitmap.getHeight() / ratio, paint);<br> paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));<br> canvas.drawBitmap(bitmap, rect, rect, paint);<br> return output;<br> <br> }<br> <br> public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {<br> int w = bitmap.getWidth();<br> int h = bitmap.getHeight();<br> Matrix matrix = new Matrix();<br> float scaleWidth = ((float) width / w);<br> float scaleHeight = ((float) height / h);<br> matrix.postScale(scaleWidth, scaleHeight);<br> Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);<br> return newbmp;<br> }<br> <br> <br> public static String savePhotoToSDCard(Bitmap bitmap) {<br> String photoName = "";<br> if (checkSDCardAvailable()) {<br> // 图片时间命名<br> SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");<br> Date date = new Date(System.currentTimeMillis());<br> photoName = format.format(date);<br> // 存储至DCIM文件夹下<br> File dir = new File(Environment<br> .getExternalStorageDirectory() + "/Stw/temp/save/");<br> if (!dir.exists()) {<br> dir.mkdirs();<br> }<br> <br> File photoFile = new File(dir.getAbsolutePath(), photoName + ".png");<br> Bitmap photoBitmap = bitmap;<br>// FileOutputStream fileOutputStream = null;<br>// try {<br>// fileOutputStream = new FileOutputStream(photoFile);<br> if (photoBitmap != null) {<br>// double maxSize = 400.00;<br> // 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大)<br> ByteArrayOutputStream baos = new ByteArrayOutputStream();<br> photoBitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos);<br> int options = 80;//先压缩到80%<br> while (baos.toByteArray().length / 1024 > 200) { // 循环判断如果压缩后图片是否大于200kb,大于继续压缩<br> if (options <= 0) {//有的图片过大,可能当options小于或者等于0时,它的大小还是大于目标大小,于是就会发生异常,异常的原因是options超过规定值。所以此处需要判断一下<br> break;<br> }<br> baos.reset();// 重置baos即清空baos<br> options -= 10;// 每次都减少10<br> bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);<br> }<br>// byte[] b = baos.toByteArray();<br>// // 将字节换成KB<br>// double mid = b.length / 1024;<br>// // 判断bitmap占用空间是否大于允许空间 如果大于则压小于则不压缩<br>// if (mid > maxSize) {<br>// // 获取bitmap大小 是允许最大大小的多少<br>// double i = mid / maxSize;<br>// // 压缩 此处用到平方将宽带和高度压缩掉对应的平方根<br>// // 保持刻度和高度和原bitmap比率,压缩后也达到了大小占用空间的大小)<br>// photoBitmap = zoomImage(photoBitmap,<br>// photoBitmap.getWidth() / Math.sqrt(i),<br>// photoBitmap.getHeight() / Math.sqrt(i));<br>// }<br>// if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100,<br>// fileOutputStream)) {<br>// fileOutputStream.flush();<br>// // fileOutputStream.close();<br>// }<br> try {<br> FileOutputStream fos = new FileOutputStream(photoFile);<br> fos.write(baos.toByteArray());<br> fos.close();<br> baos.close();<br> return photoFile.getAbsolutePath();<br> } catch (Exception e) {<br> <br> }<br> <br> <br> }<br>// } catch (FileNotFoundException e) {<br>// photoFile.delete();<br>// e.printStackTrace();<br>// } catch (IOException e) {<br>// photoFile.delete();<br>// e.printStackTrace();<br>// } finally {<br>// try {<br>// if (fileOutputStream != null) {<br>// fileOutputStream.close();<br>// }<br>// } catch (IOException e) {<br>// e.printStackTrace();<br>// }<br>// }<br> <br> }<br> <br> return null;<br> }<br> <br> /**<br> * 压缩图片<br> */<br> public static Bitmap zoomImage(Bitmap bgimage, double newWidth,<br> double newHeight) {<br> // 获取这个图片的宽和高<br> float width = bgimage.getWidth();<br> float height = bgimage.getHeight();<br> // 创建操作图片用的matrix对象<br> Matrix matrix = new Matrix();<br> // 计算宽高缩放�?<br> float scaleWidth = ((float) newWidth) / width;<br> float scaleHeight = ((float) newHeight) / height;<br> // 缩放图片动作<br> matrix.postScale(scaleWidth, scaleHeight);<br> Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,<br> (int) height, matrix, true);<br> return bitmap;<br> }<br> <br> //检查sd卡是否存在<br> public static boolean checkSDCardAvailable() {<br> return Environment.getExternalStorageState().equals(<br> Environment.MEDIA_MOUNTED);<br> }<br> <br> <br>}<br> <br> |
以上就是直播平台搭建,Android手机拍照和手机相册选取图片的工具, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现