4.2.3 保存基于位图的画布绘图
如果仅仅是在图像上绘制,而不能再用户创建一幅杰作之后对其进行保存,那么这将毫无意义,迄今为止,我们已经绘制了图像——接下来看看如何对这些奇妙的绘图进行持久保存。至少看看如何将他们保存到SD卡中。
毫无疑问,这与在第2章的自定义摄像头应用程序中保存捕获图像的过程类似。让我们了解一下为保存图像而对ChoosePictureDraw示例所做的改动。
在onCreate方法中获得新按钮的引用。我们会将该按钮添加到布局XML中,并在活动中声明它。
在定义了类之后,声明saveButton按钮以及其他的实例变量。
1 private Button saveButton;
在onCreate中获得choosePicture按钮的引用之后,我们将获得saveButton按钮的引用:
1 saveButton=(Button) findViewById(R.id.SavePictureButton);
随后,将该按钮的OnClickListener设置为当前活动,对choosePicture按钮进行相同的处理。
1 saveButton=(Button) findViewById(R.id.SavePictureButton);
现在,考虑到这两个不同的按钮都会使用onClick方法,因此需要对该方法进行修改。最简单的方法是将传入的View对象与按钮进行比较。如果该View对象等于某个按钮,它就是被单击的按钮。
1 @Override 2 public void onClick(View v) { 3 if(v==choosePicture){ 4 Intent choosePictureIntent=new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 5 startActivityForResult(choosePictureIntent, 0); 6 }else if(v==saveButton){ 7 if(alteredBitmap!=null){ 8 Uri imageFileUri=getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues()); 9 try{ 10 OutputStream imageFileOS=getContentResolver().openOutputStream(imageFileUri); 11 alteredBitmap.compress(CompressFormat.JPEG, 90, imageFileOS); 12 }catch(Exception e){ 13 14 } 15 } 16 } 17 }
知道单击的是saveButton按钮之后,需要确保已经定义了正用于绘制的位图图像。
1 if(alteredBitmap!=null){
完成上述的操作后,我们就准备好保存图像。与之前的示例一样,可以查询MediaStore,获取新图像的Uri,并根据该Uri创建OutputStream。
1 Uri imageFileUri=getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues()); 2 try{ 3 OutputStream imageFileOS=getContentResolver().openOutputStream(imageFileUri);
在此之前的“保存图像”的示例中,我们实际上已经获得了JPEG形式的数据,因此只须简单的将其写出到OutputStream。在当前的情况下,必须使用该位图对象的compress方法将其转换成JPEG图像(或者也可以选择PNG格式)。
compress方法压缩位图数据。并将其写出到OutputStream。它会采用在Bitmap.CompressFormat中定义的常量,即PNG或JPEG。PNG非常适合艺术线条和图形,而JPEG非常适合带渐变的全彩图像,例如照片。由于在这里使用的是照片,因此将采用JPEG格式。
下一个参数是质量设置。只有当压缩为JPEG图像时,质量设置才是有用的,因为PNG图像将始终保持所有数据,从而使质量设置无效。JPEG就是所谓的“有损的”编解码器,这意味着将会丢弃数据。质量与大小成反比关系。质量设置为0将产生一个很小的文件大小,但是图像不太美观;质量设置为100将产生一个很大的文件大小,且图像看起来非常美观。这个示例使用质量设置90,这是某种折衷选择。
需要传入的最后一个参数是实际写入文件的OutputStream。
1 alteredBitmap.compress(CompressFormat.JPEG, 90, imageFileOS); 2 }catch(Exception e){ 3 4 } 5 } 6 } 7 }
下面是更新的布局XML,其中包含了新的Save按钮。
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" 4 android:orientation="vertical" 5 > 6 <Button 7 android:id="@+id/ChoosePictureButton" 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="Choose Picture"/> 11 <ImageView 12 android:id="@+id/ChooseImageView" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:contentDescription="@string/app_name"/> 16 <Button 17 android:id="@+id/SavePictureButton" 18 android:layout_width="fill_parent" 19 android:layout_height="wrap_content" 20 android:text="Save Picture"/> 21 </LinearLayout>
posted on 2014-08-26 17:30 宁静致远,一览众山小 阅读(339) 评论(0) 编辑 收藏 举报