开源中国 2018 年度最后一场技术盛会邀你来约~错过就要等明年啦!点此立即预约

guoqi / BeautyCameraAndroid

指数
0
Watch 12 Star 40 Fork 10
加入码云
与超过 300 万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
一键美颜相机 展开 收起

guoqi 最后提交于 上传截图
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README.md

BeautyCamera

项目介绍

一键美颜相机

@Author GQ 2018年06月23日

项目中用到水印相机,还要美颜功能,记录一下实现过程,又看了一部分gpuImage文档的图片滤镜

https://github.com/BradLarson/GPUImage

https://github.com/Dean1990/MagicCamera 这个项目没跑起来 - -b

效果图

1

2

3

使用gpuImage的滤镜实现相机预览

  • 美颜滤镜
gpuImage = GPUImage(this)
gpuImage?.setGLSurfaceView(surfaceView)

magicFilterGroup = GPUImageFilterGroup()
magicFilterGroup?.addFilter(GPUImageBeautyFilter())

noMagicFilterGroup = GPUImageFilterGroup()
noMagicFilterGroup?.addFilter(GPUImageFilter())

//设置滤镜
gpuImage?.setFilter(if (isInMagic) magicFilterGroup else noMagicFilterGroup)
  • 使用GLSurfaceView显示相机预览
 <android.opengl.GLSurfaceView
            android:id="@+id/surfaceView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
  • 设置图片尺寸
parameters.setPictureSize(pictureSize.width, pictureSize.height)
  • 设置预览尺寸
parameters.setPreviewSize(closelySize.width, closelySize.height)
  • 连续对焦
//连续对焦
if (parameters.supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
                parameters.focusMode = Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE
}

使用Camera.parameters设置

  • 不同分辨率下预览变形问题
  • 预览分辨率与照片分辨率自适应最接近尺寸
  • 前后置摄像头分辨率问题

设置水印

  • 方法一: 使用canvas将原图片和水印图片重新画出来
//不同分辨率导致水印的大小不同(暂未解决)
private fun getView2Bitmap(): Bitmap {
    ll_waterMarker!!.isDrawingCacheEnabled = true
    var waterBitmapCache = ll_waterMarker.drawingCache
    var waterBitmap = Bitmap.createBitmap(waterBitmapCache, 0, 0, ll_waterMarker.width, ll_waterMarker.height)
    ll_waterMarker.destroyDrawingCache()
    var oriBitmap = (iv_img.drawable as BitmapDrawable).bitmap
    var newb = Bitmap.createBitmap(oriBitmap.width, oriBitmap.height, Bitmap.Config.ARGB_8888);
    var canvas = Canvas(newb)
    canvas.drawBitmap(oriBitmap, 0f, 0f, null)
    canvas.drawBitmap(waterBitmap, 0f, (oriBitmap.height - waterBitmap.height).toFloat() - SizeUtil.dp2px(this, 40f), null)
    canvas.save(Canvas.ALL_SAVE_FLAG);
    canvas.restore();
    return newb
}
  • 方法二: 截取Layout直接当做绘制好的带水印图片
//截取layout保存图片,会有黑边
private fun getScreenPhoto(waterPhoto: RelativeLayout?): Bitmap {
    waterPhoto!!.isDrawingCacheEnabled = true
    waterPhoto.buildDrawingCache()
    var bitmap: Bitmap? = waterPhoto.drawingCache
    val width = waterPhoto.width
    val height = waterPhoto.height
    val bitmap1 = Bitmap.createBitmap(bitmap!!, 0, 0, width, height)
    waterPhoto.destroyDrawingCache()
return bitmap1
}

更多请查看demo

项目点评 ( 1 )

你可以在登录后,发表评论

搜索帮助