Android(安卓)demo--调用系统相机拍照并显示图片为黑白
1.环境搭建
操作系统是Mac OS,一年多以前写Android的时候用的还是Eclipse,操作系统是Windows,记得环境很难搭建,总是会有错误,所以面试的时候要求完成这个Demo还是有一点点虚。不过用Baidu和Google查了怎么搭建环境之后,发现有了官方的IDE:Android Studio,我还是很开心的,决定不用eclipse搭环境了,改用Android Studio,因为这样只要安装一个软件就可以了。搭建过程参考:http://www.tuicool.com/articles/FNRfyiF
需要注意的是,安装Android Studio时会自动下载Android SDK,如果没有会出现下载失败的情况(免费可使用Lantern,安卓,mac及win都可以)。
Android Studio下载官方网站:http://developer.android.com/sdk/index.html
2.调用相机
由于很久没写Android,还是花了点时间写这一部分。
在网上找的代码,都会先判断SD卡是否存在,是否可以利用ExternalStorage。一直在纠结这个问题,因为手机没有SD卡,但其实也可以的。
调用相机部分代码很简单:
button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //open the camera startActivityForResult(camera, CAMERA); } });
调用了 startActivityForResult(camera, CAMERA);
之后就是存储修改图片的处理了。 开始有点着急,着急写Activity中的逻辑,但其实应该先将界面写好,上面是button,下方是imageview。这样看逻辑是否起作用的时候,才能确保不因为界面出错而导致错误。
Reference:
http://hxdawxyhxdawxy.iteye.com/blog/1452747
http://blog.sina.com.cn/s/blog_5da93c8f0101qu9w.html
3.保存图片并修改图片成黑白
用到了Bitmap
把数据写入图片文件:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAMERA && resultCode == Activity.RESULT_OK && null != data) { String sdState = Environment.getExternalStorageState(); if(!sdState.equals(Environment.MEDIA_MOUNTED)){ Log.w("TestFile","SD card is not avaiable/writeable right now."); return; } String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + System.currentTimeMillis()+ ".jpg"; Bundle bundle=data.getExtras(); Bitmap bm=(Bitmap)bundle.get("data"); FileOutputStream b = null; try { b = new FileOutputStream(filePath); bm.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件 } catch (FileNotFoundException e) { e.printStackTrace(); } bm=switchColor(bm); img.setImageBitmap(bm); } }
修改为黑白图片: public Bitmap switchColor(Bitmap switchBitmap){ int width=switchBitmap.getWidth(); int height=switchBitmap.getHeight(); // Turn the picture black and white Bitmap newBitmap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888); Canvas canvas=new Canvas(newBitmap); canvas.drawBitmap(switchBitmap, new Matrix(), new Paint()); int current_color,red,green,blue,alpha,avg=0; for (int i=0;i=210){ //亮度:avg>=126 //设置颜色 newBitmap.setPixel(i, j, Color.argb(alpha, 255, 255, 255));// white } else if (avg<210 && avg>=80){ //avg<126 && avg>=115 newBitmap.setPixel(i, j, Color.argb(alpha, 108,108,108));//grey }else{ newBitmap.setPixel(i, j, Color.argb(alpha, 0, 0, 0));// black } } } return newBitmap; }
Reference:
http://blog.csdn.net/bill_ming/article/details/7730305
http://blog.csdn.net/yubo_725/article/details/39576485
http://blog.sina.com.cn/s/blog_618199e60101o4i1.html
http://download.csdn.net/detail/stop_pig/8211315#comment
http://www.tuicool.com/articles/NbyIfiy
http://www.cnblogs.com/over140/archive/2011/11/21/2256727.html
http://jameskaron.iteye.com/blog/2185470
http://www.2cto.com/kf/201503/379757.html
http://blog.sina.com.cn/s/blog_8a86f4dd01018jde.html
4.future work
(1)和网上说的一样,确实出现了图片不清晰的问题,因为呈现了缩略图。那么可将图片存入sd卡,再处理。
http://my.oschina.net/u/1251149/blog/326839
(2)转换成黑白图片算法2:
public static Bitmap convertToBlackWhite(Bitmap bmp) { int width = bmp.getWidth(); // ªÒ»°ŒªÕºµƒøÌ int height = bmp.getHeight(); // ªÒ»°ŒªÕºµƒ∏fl int[] pixels = new int[width * height]; // Õ®π˝ŒªÕºµƒ¥Û–°¥¥Ω®œÒÀÿµ„ ˝◊È bmp.getPixels(pixels, 0, width, 0, 0, width, height); int alpha = 0xFF << 24; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int grey = pixels[width * i + j]; //∑÷¿Î»˝‘≠…´ int red = ((grey & 0x00FF0000) >> 16); int green = ((grey & 0x0000FF00) >> 8); int blue = (grey & 0x000000FF); //◊™ªØ≥…ª“∂»œÒÀÿ grey = (int) (red * 0.3 + green * 0.59 + blue * 0.11); grey = alpha | (grey << 16) | (grey << 8) | grey; pixels[width * i + j] = grey; } } //–¬Ω®Õº∆¨ Bitmap newBmp = Bitmap.createBitmap(width, height, Config.RGB_565); //…Ë÷√Õº∆¨ ˝æ› newBmp.setPixels(pixels, 0, width, 0, 0, width, height); Bitmap resizeBmp = ThumbnailUtils.extractThumbnail(newBmp, 380, 460); return resizeBmp;}
5.总结
(1)开始一直在SD卡上纠结,不能老是纠结在一个地方,如果一直想不通,要换一个思路。
(2)一开始就是参考网上的代码都没有弄懂,搞了两个
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
跟对Android不熟悉了也有关系。
6.future reading
(1)如果要系统的学习,那么可以多去一些学习网站
http://wenku.baidu.com/link?url=01J7boU0wx7WEsrdLci5Qa5eJTL5hIKsTm8R7a_sSV_4WwPKu1h0NzpeK0AIPbIwnCB5dvT_lpK3tMm8_KR0CsPojbrngjOUdmZyHY_bT_u
(2)Android中的资源表示:uri
http://www.cnblogs.com/hnrainll/archive/2011/11/15/2250136.html
(3)还是没太搞懂android中Internal Storage和External Storage的区别,是否是External Storage就代表SD卡呢?
http://www.2cto.com/kf/201408/329570.html
(4)Intent学习:http://www.cnblogs.com/hummersofdie/archive/2011/02/12/1952675.html
(5)startActivityForResult的用法和demo
更多相关文章
- Launcher3 总结
- (二) RIL 层分析
- Android注解-编译时生成代码 (APT)
- Android(安卓)Studio安装使用教程\环境搭建\常见问题汇总
- android Splashy Flash小游戏
- 旋屏时,OnCreate方法重复调用的解决
- Android中抓取手机视频流数据
- imageView中图片各种比例类型的显示方式的参数设置
- 介绍MVP Model-View-Presenter在Android中的应用