`

设置头像与背景图片

 
阅读更多

 

 

整个过程中遇到的问题

 

一、  显示选择对话框,操作选择

   问题1:为了解决Activity之间跳转,有黑色背景出现,添加了透明背景的Theme:windowIsTranslucent

   问题2:添加后弹出框的title背景变黑(因为样式的parent不是AppBaseTheme后来改回来就好了)

   问题3:选择图片后中间跳转到桌面,然后才弹回到activity 

   因为以上问题,Activity之间的跳转黑色背景问题没有解决

 

二、 裁切遇到的问题:裁切的时候outputX和outputY设置超过400,裁切后系统直接跳到应用首页

具体原因不知道,后来设置的值为300,程序没有问题了

 

三代码:

  1  调用相机与相册选择弹出框

   

CharSequence[] items = {"相册", "相机" };
imageHeadChooseItem(items);

 2 显示选择对话框,操作选择

 

 

	/**
	 * 显示选择对话框,操作选择
	 * 
	 * @param items
	 */
	public  void imageHeadChooseItem(CharSequence[] items) {
		AlertDialog imageDialog = new AlertDialog.Builder( this)
				.setTitle(R.string.ui_insert_image)
				.setItems(items, new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int item) {
						// 手机选图
						if (item == 0) {
							Intent intent = headImgChooser.getSelPictureIntent();
							startActivityForResult(
									Intent.createChooser(intent, "选择图片"),
									ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD);
						}
						// 拍照
						else if (item == 1) {
							Intent intent = headImgChooser.getCameraIntent() ;
							startActivityForResult(intent,  ImageUtils.REQUEST_CODE_GETIMAGE_BYCAMERA);
						}
					}
				}).create();

		imageDialog.show();
	}

 3 透明背景样式:

  

    <style name="Theme.HalfTranslucent" parent="AppBaseTheme">
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item> <!-- //对话框是否有遮盖 -->
        <item name="android:backgroundDimEnabled">true</item>
    </style>

 4  图片选择工具类

  

/**
 * 图片选择工具类
 * @author root
 *
 */
public class ImageChooser {
	
	private Context context ; 
	private String savePath ; //拍照图片保存路径 ,无文件名
	private String imgPath ; //拍照图片保存路径,包括文件名称
	
	public ImageChooser(Context context ){
		this.context = context;
	}

	
    //拍照获取头像
	public  Intent getCameraIntent() {
		
		savePath =  getPhotoImgPath();
		// 没有挂载SD卡,无法保存文件
		if (StringUtils.isEmpty(savePath)) {
			Toast.makeText(context, "无法保存照片,请检查SD卡是否挂载",  Toast.LENGTH_LONG).show();
			return null;
		}

		String timeStamp = new SimpleDateFormat(
				"yyyyMMddHHmmss").format(new Date());
		String fileName =  timeStamp + ".jpg";// 照片命名
		File out = new File(savePath, fileName);
		Uri uri = Uri.fromFile(out);

		imgPath = savePath + fileName;// 该照片的绝对路径
		Intent intent = new Intent(
				MediaStore.ACTION_IMAGE_CAPTURE);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
		return intent;
	}

	/**
	 * 取出intent 从相册中选择图片
	 */
	public  Intent getSelPictureIntent(){
		Intent intent;
		if (Build.VERSION.SDK_INT < 19) {
			intent = new Intent();
			intent.setAction(Intent.ACTION_GET_CONTENT);
		} else {
			intent = new Intent(
					Intent.ACTION_PICK,
					android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
		}
		intent.setType("image/*");
		return intent;
	}

	
	 
	/**
	 * 得到照相机图片存储位置
	 * @return
	 */
	public  String getPhotoImgPath(){
		String savePath = "";
		// 判断是否挂载了SD卡
		String storageState = Environment
				.getExternalStorageState();
		if (storageState.equals(Environment.MEDIA_MOUNTED)) {
			savePath = Environment
					.getExternalStorageDirectory() 
					+ "/项目名称/Camera/";// 存放照片的文件夹
			File savedir = new File(savePath);
			if (!savedir.exists()) {
				savedir.mkdirs();
			}
		}
		return savePath;
	}
	/**
	 * 得到剪切图片的intent 
	 * @return
	 */
	public static Intent getCropImgIntent(Uri uri,Integer aspectX,
			Integer aspectY,Integer outputX ,Integer outputY){
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // crop为true是设置在开启的intent中设置显示的view可以剪裁
        intent.putExtra("crop", "true");
        //intent.putExtra("scale", true);
        
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);

        // outputX,outputY 是剪裁图片的宽高
        intent.putExtra("outputX", outputX);
        intent.putExtra("outputY", outputY);
        intent.putExtra("return-data", true);
        intent.putExtra("noFaceDetection", true);
       return intent;
	}


	public String getImgPath() {
		return imgPath;
	}


	public void setImgPath(String imgPath) {
		this.imgPath = imgPath;
	}
}

 

5  选择头像和背景的处理,并且选择后进行裁切

 

        //选择头像和背景的处理,并且选择后进行裁切
	@SuppressLint("HandlerLeak")
	@Override
	public void onActivityResult(final int requestCode,
			final int resultCode, final Intent imageReturnIntent) {
		if (resultCode != this.RESULT_OK)
			return;
		Uri uri; 
		Intent intent ; 
		
		switch (requestCode ) {
			case ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD://头像请求相册
				if(imageReturnIntent==null) 
					return ;
				uri = imageReturnIntent.getData();
		        intent = ImageChooser.getCropImgIntent(uri,1,1,300,300);
		        startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP);
				
				break;
			case ImageUtils.REQUEST_CODE_GETIMAGE_BYCAMERA://头像请求相机
				//拍照的时候 imageReturnIntent 为空
				if(!StringUtils.isEmpty( headImgChooser.getImgPath())){
					//跳转图片裁切
					//uri = Uri.parse(headImgChooser.getImgPath());
					uri = Uri.fromFile(new File(headImgChooser.getImgPath()));
					intent = ImageChooser.getCropImgIntent(uri,1,1,300,300);
			        startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP);
				}
				break;
			case ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP: //头像裁切结束 
				 Bundle bundle = imageReturnIntent.getExtras();
				 if(bundle!=null){
					 Bitmap photo = bundle.getParcelable( "data");
					 if(photo!=null){
						 //这里上传头像photo 
						 upLoadHeadImageHttp(photo);
						 img_my_head.setImageBitmap(photo );
					 }
				 }
				
				break;
			case ImageUtils.REQUEST_CODE_GETIMAGE_BYCAMERA_BG://背景 照相 
				//拍照的时候 imageReturnIntent 为空

				if(!StringUtils.isEmpty( bgImgChooser.getImgPath())){
					//跳转图片裁切
					uri = Uri.fromFile(new File(bgImgChooser.getImgPath()));
					intent = ImageChooser.getCropImgIntent(uri,3,2,300,200);
			        startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP_BG1);
				}
				
				break;
			case ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD_BG://选择照片
 
				if(imageReturnIntent==null) 
					return ;
				uri = imageReturnIntent.getData();
		        intent = ImageChooser.getCropImgIntent(uri,3,2,300,200);
		        startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP_BG1);
		        
				break ;
			case ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP_BG1://背景图片裁切
				 Bundle bundle1 = imageReturnIntent.getExtras();
				 if(bundle1!=null){
					 Bitmap photo = bundle1.getParcelable( "data");
					 if(photo!=null){
						 //保存背景图片
						 saveBGImage(photo);
					 }
				 }
				 
				break;
 
			default:
				break;
		} 	 
	}

 6 保存背景图片到缓存中

  

	/**
	 * 保存背景图片到缓存中
	 * @param bgImgPath
	 */
	private void saveBGImage(Bitmap bgImg ){

		try {
			ImageUtils.saveImage(this, bgImgName,  ImageUtils.compressImage(bgImg) );
			sharePre.putString( SharedPreferencesUtils.BG_IMAGE, bgImgName );
			headLayout.setBackground( ImageUtils.getDrawable(this,  bgImgName));
		} catch (IOException e) {
			e.printStackTrace();
		}	
      }

 7 图片按比例压缩,压缩到100k左右

   

	public static  Bitmap compressImage(Bitmap image) {

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
		int options = 100;
		while ( baos.toByteArray().length / 1024>100) {	//循环判断如果压缩后图片是否大于100kb,大于继续压缩		
			baos.reset();//重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
			options -= 10;//每次都减少10
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
		return bitmap;
	}

 

8 写图片文件 在Android系统中,文件保存在 /data/data/PACKAGE_NAME/files 目录下 

   

	/**
	 * 写图片文件 在Android系统中,文件保存在 /data/data/PACKAGE_NAME/files 目录下
	 * 
	 * @throws IOException
	 */
	public static void saveImage(Context context, String fileName, Bitmap bitmap)
			throws IOException {
		saveImage(context, fileName, bitmap, 100);
	}

	public static void saveImage(Context context, String fileName,
			Bitmap bitmap, int quality) throws IOException {
		if (bitmap == null || fileName == null || context == null)
			return;

		FileOutputStream fos = context.openFileOutput(fileName,
				Context.MODE_PRIVATE);
		ByteArrayOutputStream stream = new ByteArrayOutputStream();
		bitmap.compress(CompressFormat.JPEG, quality, stream);
		byte[] bytes = stream.toByteArray();
		fos.write(bytes);
		fos.close();
	}

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    设置头像及透明背景

    本教程将深入探讨如何实现“设置头像及透明背景”的功能,这涉及到自定义圆形头像和调整背景图片的透明效果。以下是一些核心知识点: 1. **圆形头像**:在用户界面设计中,圆形头像常用于显示个人资料或用户头像,...

    上传头像和更改背景

    3. **图片选择与上传**:若允许用户上传图片作为背景,那么过程与“上传头像”类似,包括文件选择、预览、处理和上传等步骤。 4. **实时预览**:用户在选择背景时,应实时预览效果,以便做出满意的选择。 5. **保存...

    头像,背景图片上传详解1

    在本文中,我们将深入探讨如何在Spring Boot应用中实现头像上传的功能,包括前端界面设计、图片处理以及后端服务的实现。头像上传通常涉及以下几个关键步骤: 1. **前端页面样式**: - 前端界面设计通常包含两个...

    3.[1000张背景图片素材].zip

    "夜景素材"则明确指出是一类与夜晚相关的背景图片,可能包括星空、城市夜景、月光下的景色等,非常适合用于创建浪漫、神秘或宁静的氛围。 在实际应用中,设计师可以利用这些背景图片素材进行创作,例如: 1. **...

    唯美风格的水彩手绘樱花PPT背景图片.zip

    3. "第一PPT.url" - 这通常是一个快捷方式文件,指向与PPT相关的内容,可能是同一网站上的其他页面,或者是有关如何使用这些背景图片的教程或指南。 在PPT设计中,背景图片的选择至关重要,因为它可以极大地影响...

    html5头像上传拖动图片头像截图效果

    8. **CSS样式和布局**: 为了实现拖放区域的可视化效果,需要使用CSS来定义拖放区域的样式,包括边框、背景色、阴影等,同时也要处理好拖放元素与页面其他元素的布局关系。 9. **异步处理和Ajax请求**: 图片上传通常...

    仿qq空间头像背景拉伸效果

    这种效果在用户上下滑动时,可以使背景图片根据手势动态地拉长或缩短,从而创造出视觉上的流畅体验。核心在于一个自定义的ImageView组件,这里我们主要关注`ExpandImageView`这个类。 在Android开发中,为了实现...

    ios-相机相册选择图片修改头像,本地存储,背景图高斯模糊.zip

    在iOS开发中,用户经常需要实现从相机或相册选择图片进行特定操作,例如修改头像或设置背景图片。这个“ios-相机相册选择图片修改头像,本地存储,背景图高斯模糊.zip”项目提供了这样的功能实现,主要涉及以下几个...

    仿G+个人资料滑动时头像背景滚动变化

    - **设置背景图片**:在布局文件中,我们需要为个人资料头像下方添加一个用于显示背景的ImageView,通常设置为全屏大小。可以使用`android:scaleType="centerCrop"`保持图片的纵横比,并确保填充整个视图。 - **...

    QQ6.5群资料卡背景图片如何设置.docx

    QQ6.5版的群资料卡背景图片设置教程 在QQ这款流行的即时通讯软件中,用户可以自定义群聊的资料卡,以展示独特的个性化风格。对于那些希望将自己的群聊设置得更加生动有趣的用户,了解如何设置群资料卡背景图片至关...

    微信如何设置成全透明的头像.zip

    返回聊天界面,您会发现新设置的头像在聊天背景上几乎是透明的,只有在特定背景下,比如有纯色或者特定图案的地方,才能看出与背景的差异。 请注意,微信可能会对上传的头像进行一定的压缩,这可能导致透明度稍有...

    云开发版粉色ui微信小程序源码/背景图/头像/壁纸/小程序源码 带流量主

    【已测】云开发版粉色ui微信小程序源码/背景图/头像/壁纸/小程序源码 带流量主 云开发小程序源码无需服务器和域名即可搭建小程序另外还带有流量主功能噢!微信平台注册小程序就可以了 这套粉色UI非常的好看,里面...

    QQ2021怎么设置透明头像.docx

    透明头像通常是一个PNG格式的图片,这种格式支持透明背景。你可以通过网络资源获取这样的素材,例如文中提到的下载地址:http://pan.baidu.com/s/1ntnCjyD。确保下载的图片是真正的透明头像,即背景部分是完全透明的...

    玻璃透明的头像图片素材

    透明图片素材之所以如此受欢迎,是因为它们能够与各种背景无缝融合,创造出独特的视觉效果。其秘密就在于PNG图像格式的强大能力,它通过Alpha通道可以精确控制图像的透明度,让图片的某些部分完全透明,而其他部分则...

    2022虎年背景全新UI头像框制作微信小程序源码.zip

    在本项目中,我们拥有一个名为“2022虎年背景全新UI头像框制作微信小程序源码.zip”的压缩包文件,它包含了用于创建一个与2022虎年主题相关的微信小程序的完整源代码。这个小程序的核心功能是让用户能够使用一系列与...

    安卓头像制作图片圆角剪裁相关-Android创建抗锯齿透明背景圆角图像.zip

    本压缩包文件“安卓头像制作图片圆角剪裁相关-Android创建抗锯齿透明背景圆角图像.zip”包含了一些资源和源码,可以帮助开发者实现这一功能。下面我们将详细探讨如何在Android中创建这样的图像。 首先,我们可以从...

    人人开源renrenfast+图片背景

    2. **背景替换**:允许用户选择不同的背景图片,或者设置纯色背景,可以应用于头像、海报等场景。 3. **编辑工具**:可能包含裁剪、旋转、滤镜等基础编辑功能,以及调整亮度、对比度、饱和度等高级选项。 4. **模板...

    根据中文首字生成图片如头像等场景需求

    在IT行业中,根据中文首字生成图片是一种常见的个性化定制服务,尤其在用户头像生成、社交媒体标识等方面有广泛应用。这个场景需求通常涉及到图像处理、文本处理以及编程技术。以下是相关知识点的详细介绍: 1. **...

    头像显示圆形图片或纯颜色加字体

    标题“头像显示圆形图片或纯颜色加字体”所指的就是这样一个功能,它涉及到`circleimage`、`android`、`图片显示圆形`以及`自定义控件`等技术点。下面将详细讲解如何实现这个功能。 首先,Android系统默认并没有...

    Android布局自定义Shap圆形ImageView可以单独设置背景与图片

    本篇文档主要讲解了如何在Android布局中自定义一个圆形ImageView,使其可以单独设置背景与图片。通过这种方式,可以实现一个具有圆形边框的图片显示效果,常用于头像或者图标的设计。 首先,我们来了解一下...

Global site tag (gtag.js) - Google Analytics