Android实现图片裁剪
MainActivity.java
package com.kale.imagetailor; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { private String tag = getClass().getSimpleName(); private static Uri imageUri; Button imageTailorBt; ImageView userIV; File file; FileManager fm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewInit(); fm = new FileManager(); try { file = fm.creatSDFile("Kale Image", "userImage.jpg"); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } /** *每次开启时判断设置什么图片,如果有自定义的图片了,那么就用用户自己的头像 */ private void setUserImage(){ userIV.setImageResource(R.drawable.ic_launcher); //从sd卡中得到图片资源 String filepath = fm.getFileWholePath(); Bitmap bm = BitmapFactory.decodeFile(filepath); if(bm != null){ //BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。 userIV.setImageDrawable(new BitmapDrawable(bm)); } else{ userIV.setImageResource(R.drawable.ic_launcher); } } private void viewInit(){ userIV = (ImageView)findViewById(R.id.user_imageView_id); imageTailorBt = (Button)findViewById(R.id.image_tailer_button_id); imageTailorBt.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO 自动生成的方法存根 changeUserImage(); } }); } /** *改变用户头像的方法,这里设定一个intent交给activity去处理 */ protected void changeUserImage(){ Toast.makeText(getApplicationContext(), "更换头像", 0).show(); imageUri = Uri.parse("file:///sdcard/temp.jpg"); Intent intent = null; intent = new Intent(Intent.ACTION_GET_CONTENT, null); intent.setType("image/*");// 设置属性,表示获取任意类型的图片 intent.putExtra("crop", "true");// 设置可以滑动选选择区域的属性,注意这里是字符串"true" intent.putExtra("aspectX", 1);// 设置剪切框1:1比例的效果 intent.putExtra("aspectY", 1);// 设置剪切框1:1比例的效果 intent.putExtra("outputX", 600); intent.putExtra("outputY", 600); intent.putExtra("scale", true); intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", false); // no face detection startActivityForResult(intent, 1); } /** * @param uri * @return 一个bitmap对象,用来设置图片 */ private Bitmap decodeUriAsBitmap(Uri uri){ Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } return bitmap; } /** * 用来设置图片,并保持的本地 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //不正确的情况下 if(resultCode != Activity.RESULT_OK){ Log.e(tag, "requestCode = " + requestCode); Log.e(tag, "resultCode = " + resultCode); Log.e(tag, "data = " + data); return; } else{ Log.d(tag, "CHOOSE_A_BIG_PICTURE: data = " + data); if(imageUri != null){ Bitmap photo = decodeUriAsBitmap(imageUri); try { //保存到本地文件 File pictureFile = file; FileOutputStream fos = new FileOutputStream(pictureFile); photo.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.close(); Toast.makeText(this, "设置成功~", 0).show(); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(this, "保存路径不存在", 0).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "设置图片失败", 0).show(); } } } setUserImage(); } }
FileManager.java
package com.kale.imagetailor; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.os.Environment; /** * @tips : * <!-- 读写SD卡的权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> * @date :2014-6-30 */ public class FileManager { private String SD_PATH; private String fileName; private String dirName; public String getSD_PATH() { return SD_PATH; } public FileManager() { //得到当前外部存储设备的目录 SD_PATH = Environment.getExternalStorageDirectory() + "/"; } /** * 在SD卡上创建文件 * * @throws IOException */ public File creatSDFile(String dirName ,String fileName) throws IOException { this.fileName = fileName; this.dirName = dirName; File file = new File(creatSDDir(dirName), fileName); return file; } public String getFileWholePath(){ return SD_PATH + dirName + "/" + fileName; } /** * 在SD卡上创建目录 * * @param dirName */ public File creatSDDir(String dirName) { File dir = new File(SD_PATH + dirName); dir.mkdir(); return dir; } /** * 判断SD卡上的文件夹是否存在 */ public boolean isFileExist(String fileName ,String dirName){ File file = new File(SD_PATH +dirName+"/"+ fileName); return file.exists(); } /** * 将一个InputStream里面的数据写入到SD卡中 */ public File saveToSdCard(String dirName,String fileName,InputStream input){ File file = null; OutputStream output = null; try{ //创建目录 creatSDDir(dirName); //建立文件 file = creatSDFile(dirName ,fileName); output = new FileOutputStream(file); byte buffer [] = new byte[5 * 1024]; int count = 0; while((count = input.read(buffer)) != -1){ String str = new String(buffer,0,count); //str = new String(str.getBytes("iso-8859-1"),"utf-8"); System.out.println("---------File Manager----start--------"); System.out.println(str); System.out.println("---------File Manager-----end-------"); output.write(buffer); } output.flush(); } catch(Exception e){ e.printStackTrace(); } finally{ try{ output.close(); } catch(Exception e){ e.printStackTrace(); } } return file; } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <Button android:id="@+id/image_tailer_button_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="裁剪图片" /> <ImageView android:id="@+id/user_imageView_id" android:layout_width="300dp" android:layout_height="300dp" android:layout_above="@+id/image_tailer_button_id" android:layout_centerHorizontal="true" android:layout_marginBottom="100dp" android:src="@drawable/ic_launcher" /> </RelativeLayout>
代码:http://download.csdn.net/detail/shark0017/7623057
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?