我想让png水印素材png覆盖在框架显示的影片之上,作为一个假png水印素材展示,应该怎么操作呢?

png jpeg,请高手帮我做一个图片上天天特价的310x310像素,JPG、JPEG、PNG格式,大小不超过1M。图片要求:无logo、无水印、无文字信息等 - 中国linux论坛
png jpeg,请高手帮我做一个图片上天天特价的310x310像素,JPG、JPEG、PNG格式,大小不超过1M。图片要求:无logo、无水印、无文字信息等
00:25:31&&&来源:中国linux论坛&&&作者:中国linux论坛&&&
png jpeg,请高手帮我做一个图片上天天特价的310x310像素,JPG、JPEG、PNG格式,大小不超过1M。图片要求:无logo、无水印、无文字信息等问题详情:
和png jpeg,请高手帮我做一个图片上天天特价的310x310像素,JPG、JPEG、PNG格式,大小不超过1M。图片要求:无logo、无水印、无文字信息等相关的图片:回答1:好了,及时采纳。相关图片:回答2:310*310=2&相关图片:
资源多媒体最新文章――我要分享――
怎么成批处理图片及加水印?
一、以下是处理图片以及加水印的方式,使用的是PHOTOSHOP 1.首先,新建两个文件夹,一个就叫做原始图,里面存放的是原始图片,另一个就叫做水印图,里面存放的是加了水印之后的图片。 2.然后,打开PHOTOSHOP,打开原始图文件夹里的任意一张图片,然后在菜单
一、以下是处理以及加的方式,使用的是PHOTOSHOP
1.首先,新建两个文件夹,一个就叫做原始图,里面存放的是原始,另一个就叫做图,里面存放的是加了水印之后的图片。
2.然后,打开PHOTOSHOP,打开原始图文件夹里的任意一张图片,然后在菜单栏,窗口下拉菜单下面,勾选动作,或者直接按Alt+F9,就会跳出动作浮动面板。如下图: 点击创建新动作按钮,弹出新动作对话框:在名称栏中输入&批量水印&,然后单击&记录&按钮开始记录动作。
3.点击文字按钮(如果没看到文字工具,就在菜单栏的窗口的下拉菜单里勾选工具),
4.然后在图片的适当位置输入你想要输入的文字,调整文字的大小和颜色。调整到自己满意为止。
5.在图层面板里点击刚刚您输入文字的那个文字图层,使那个小眼睛后面出现一支笔的形状哦,(如果您的图层面板没有出现在画面之中您也可以点击菜单栏中的窗口选项,在图层前面打勾),然后将模式选择为叠加。
6.将此图片另存为,点击文件选项里面的另存为(或者存储为),目标文件夹是水印图文件夹,保存类型为JEPG,点击&保存&.
7. 返回到&动作&面板中单击停止播放/记录按钮停止记录,到此动作就创建完成了,现在就可以关闭刚刚编辑的那张图片。
8.在菜单栏中选择文件-自动-创建快捷命令,弹出下面的对话框:在&将快捷存储于&一栏中点击&选取&按钮,然后在弹出的对话框中选择水印图文件夹,在文件名一栏中输入&批量水印&,按&保存&。
在&播放&栏中设置&组合&为默认动作,&动作&为批量水印,该动作是刚才创建的动作;在&目的&下拉列表中选择&文件夹&,单击其下的&选择&按钮,并在弹出的对话框中选择水印图文件夹,将其下面的复选框&覆盖动作&存储为&命令&选中,点击&好&。
9、好了,不要关闭您的PHOTOSHOP哦,现在进行最后一项工作。现在打开水印图文件夹,您可以看到一个名称为&批量水印.exe&的应用程序了吧,接下来在原始图文件夹上单击右键选择复制,然后在&批量水印.exe&图标上面点击右键选择粘贴就大功告成啦,接下来PHOTOSHOP会完成所有工作,等PHOTOSHOP停止工作的时候,打开水印图文件夹,就可以看到原始图文件夹里面的图片已经全都被加了水印,并且保存在水印图文件夹。
二、相机使用技巧
1、保持相机的稳定许多刚学会拍摄的朋友们常会遇到拍摄出来的图象很模糊的问题,这是由相机的晃动引起的,所以在拍摄中要避免相机的晃动。你可以双手握住相机,将肘抵住胸膛,或者是靠着一个稳定的物体。并且要放松,整个人不要太紧张。感觉你就象是一个射手手持一把枪,必须稳定的射击。
2、让太阳在你的身后摄影缺少了光线就不能成为摄影,它是光与影的完美结合,所以在拍摄时需要有足够的光线能够照射到被摄主体上。最好的也是最简单的方法就是使太阳处于你的背后并有一定的偏移,前面的光线可以照亮宝贝,使它的色彩和阴影变亮,轻微的角度则可以产生一些阴影来显示出宝贝的质地。
3、缩小拍摄距离有时候,只需要简单地离宝贝近一些,就可以得到比远距离拍摄更好的效果。你并不一定非要把整个宝贝全部照下来,有时候,对宝贝的某个具有特色的地方进行夸大拍摄,反而会创造出具有强烈视觉冲击力的图象出来。
4、拍摄样式的选定相机不同的举握方式,拍摄出来的图象的效果就会不同。最简单的就是竖举和横举相机。竖着拍摄的照片可以强调宝贝儿的高度,而横举则可以宝贝儿的宽度。
5、变换拍摄风格你可能拍摄过很多宝贝,但它们很可能都是一种风格,所以看多了就会给人一种一成不变的感觉。所以你应该在拍摄中不断的尝试新的拍摄方法或情调,为你的宝贝增添光彩。比如说你可以分别拍摄一些宝贝的全景、特写镜头或单个、多个等等。
6、增加景深景深对于好的拍摄来说非常重要。我想每个卖家都不希望自己拍摄的宝贝看起来就象是个平面,没有一点立体感。所以在拍摄中,就要适当的增加一些用于显示相对性的参照物。最好通过对比,可以显示出宝贝的大小。(在拍摄毛绒玩具是就经常用矿泉水瓶作为参照,这样大家对他的大小就一目了然了)
7、正确的构图拍摄好宝贝构图非常关键。摄影上比较常见的构图就有三点规则。画面被分为三个部分(水平和垂直),然后将被摄物体置于线上或是交汇处。总是将宝贝置于中间会让人觉得厌烦,所以不妨用用三点规则来拍摄一下你的宝贝。让人们在逛你的小店时,感觉到是在欣赏摄影作品。
三、商品摄影误区.
1.相机像素越高越好其实不然,200-300万就够了。商品的照片一般都是的,甚至更小。太大的图只会拖累你,处理起来对硬件要求也高。
摄像头不要用,画面太灰。摄像机的静照可以用。
2.相机的手动模式一定比自动模式的效果好如果你只是一个新手,那还是自动算了。
3.好照片都是后期处理过的其实真正的好照片,在拍摄时就已经考虑好了构图、明暗等,后期最多加点文字之类的。争取一步到位,不要寄希望于后期的处理。因为后期处理是很费时间的,而且会有点失真。
4.看了&秘籍&就能一步登天,拍出骇世惊俗的照片时间万事,都是有个积累的过程。从量变到质变。在技术上,你我都是一样的。不一样的就是审美情趣、创意上的差别。要多看,多拍,关键是多想,多总结。不知不觉中会有变化的。不要希望一口气吃成胖子。审美观是一种潜移默化的东西
网上卖产品,没有实物,客户如何直观了解你的产品,进入你的旺铺,首先看到的是图片,别小看一张张大小不一的图片,好的图片设计能给您带来成倍的浏览量及成交量,相信很多商家明白这个道理,今天我给大家讲讲图片处理的方法及重要性。
四、图片处理软件
&& 一般使用较多的图片处理软件有两款,Adobe Photoshop CS4(简单PS)和美图秀秀。美图秀秀这款软件属于傻瓜式操作,很简单,PS的功能很强大,能做复杂的图片处理。
五、图片处理技巧
1、图片大小调整及添加文字
打开PS软件,点击左上角文件--打开,选择一张之前拍摄好的图片,点击图像--图像大小,通过调整像素中的宽度和高度来缩小和放大图片大小。约束比例这项一定要打勾,能保证不管缩小多少,图片都是成比例的。
提醒:阿里巴巴要求上传图片不超过1MB,支持jpg.jpeg.gif.png.bmp.
为了不让同行盗用我的图片,同时展示我司的商标或公司名称,要给图片添加水印。添加水印的方法有两种:
①打开阿里助手--旺铺--图片管家--设置水印,选择显示企业网站或公司名称,以及公司名称的位置,设置好后,记得保存哦!
②使用PS加水印,打开PS软件,点击左上角文件--打开,选择一张之前拍摄好的图片,选择左边的文字编辑器、鼠标放到&T&上,点击会出现横排和直排文字,可根据图片需要进行选择。
选好之后、鼠标放到将要添加文字的图片上,输入汉字之后,选住文字,可以进行颜色、字体、大小更换。
点击编辑--自由变换 可以使文字放大、缩小、移动、随意旋转角度。设置好后,点击回车。
如果想让文字更有立体感,有投影、发光、光泽等效果,可以点击图层--图层样式--混合选项,对文字进行修饰,水印可以加公司名字、产品标志或联系方式。
图片做好后,记得保存,点击文件--存储为,选择JPEG格式,如以后还想再编辑,可选择Photoshop格式
看看我做成的效果图,水平一般,供参考吧:
搜索相关文章:
(责任编辑:51自学网)
------分隔线----------------------------
原图 最终效果图 再挑选一张背景相近的照片,如Pic2。我们借助这张照片来完成对Pic1上...
照片美化+圆角边框+水印 阿里巴巴
来源: taobao社区 专题: 淘宝 这种简...
软件简介 ps照片美化滤镜插件 Portrait professional 10.9.3 汉化破解版经过我们检查...
EPC相框专家 本软件是为照片添加相框、制作大头贴的专门软件,使用特别简单,只需要点...
软件介绍 ps照片美化器 Picasa图片处理软件下载 立即美化你的照片 对于喜欢做些简单的...
软件介绍 ps照片美化软件 在线涂鸦PS,在线图片处理,图片美化 | 114la工具箱在线涂鸦PS...增加录像时间戳水印、 camera框架介绍_-IT行业第一站
增加录像时间戳水印、 camera框架介绍
标题:增加录像时间戳水印、 camera框架介绍
分类:&android&129人阅读&&收藏&举报
最近项目上要在mtk6589机器上增加录像的水印功能,那个纠结呀…… &一大通 度娘、google啊……
最终整个变通的方案:做好10几个bmp(8位深度)贴图,把文件使用ue去除掉bmp文件头之后再使用工具FILE2C转成C数组,然后贴在在camera视频数据中。
留个记录以便于有朋友有类似需求,也方便以后自己查看
1、 制作bmp位图数据文件:digital_data.h
const int digital_width =24;
const int digital_height =38;
const int gap_width = 0;
const unsigned char colon[912] = {&0x00,0x00,...} & &黑底白字位图,数据要么为0x00,要么为0xff
const unsigned char* DigitalArray[] = {
&digital_0[0],
&digital_1[0],
&digital_2[0],
&digital_3[0],
&digital_4[0],
&digital_5[0],
&digital_6[0],
&digital_7[0],
&digital_8[0],
&digital_9[0],
2、把位图数据覆盖到视频数据的相应位置
CameraSource.cpp &
void CameraSource::dataCallbackTimestamp(int64_t timestampUs,
& & & & int32_t msgType, const sp&IMemory& &data) {
& & CHECK(data != NULL && data-&size() & 0); 本行及以上为原始代码, 中间为新增代码
[cpp]&view
& & mFramesReceived.push_back(data);本行及以下代码为原始代码
3,、改方式仅为临时方式,以后有待改进,最好能在代码中把text文本做成bitmap格式然后贴到视频数据上,但目前一直没找到方法实现……
下面列出参考文件:
以下内容转自:http://blog.csdn.net/tankai/article/details/
camera 录像过程:
最近调试系统Camera,遇到如下问题:在录像过程中,拔掉Camera;会出现应用程序卡死现象。
& 先说说之前的设计架构:
& 当用户拔掉Camera时,会给应用程序发送广播;当应用程序收到广播后调用Activity类的finish方法(系统会自动调用onPause方法),而我们的onPause方法做了停止录制和关闭Camera的动作。
& 问题出在:
& 当调用系统MediaRecorder的stop方法停止录制时,应用程序因为阻塞而卡死。
下面就着重分析下系统Camera和MediaRecorder(libstagefright中MPEG4Writer以及CameraSource的关系)。
& 首先,通过图示、看看Android系统Camera录像时的调用时序:
1.录像命令时序
2.录像数据回调时序
一、应用部分
1.主Activity启动
packages/apps/Camera/src/com/android/camera/CameraActivity.java
[java]&view
2.录像Activity初始化
packages/apps/Camera/src/com/android/camera/VideoModule.java
[java]&view
3.开始录制和停止录制
[java]&view
二、框架部分
1.MediaRecorder的API部分
frameworks/base/media/java/android/media/MediaRecorder.java
[java]&view
2.Native部分
frameworks/base/media/jni/android_media_MediaRecorder.cpp
[cpp]&view
3.C++部分
frameworks/av/media/libmedia/MediaRecorder.cpp
[cpp]&view
4.服务端(Android的Binder)
frameworks/av/media/libmediaplayerservice/MediaRecorderClient.cpp
[cpp]&view
Android4.2多媒体使用Stagefright架构
frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
[cpp]&view
MPEG4编码器部分
frameworks/av/media/libstagefright/MPEG4Writer.cpp
[cpp]&view
当有数据来时CameraSource的dataCallbackTimestamp函数会被调用,如此、完成视频录制。
三、分析问题
& 我们的问题就出在直接拔掉Camera时;应用程序调用mMediaRecorder.stop()超时卡死;经分析是上述框架部分“Camera拔出时录制的主线程不能退出、导致接口阻塞”。后调试发现:mDone变量并不能在两个线程间传参数;后打入之前一个patcher(see bug 4724339),修改了主线程中的mSource-&read、并在相应的while循环中做判断,问题解决。
frameworks/av/media/libstagefright/CameraSource.cpp
[cpp]&view
四、补充,分析MPEG4中Audio流程;接分析二中的实现
1.Audio录音
frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
[cpp]&view
frameworks/av/media/libstagefright/AudioSource.cpp
[cpp]&view
至此,MediaRecorder与AudioFlinger建立联系。
2.Audio放音
MediaPlayer播放音频服务端(后边有时间在具体分析应用程序/客户端流程):
frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
[cpp]&view
以下转自: /kf/681.html
Camera 调用流程:
1. & & & 首先是调用framework层的Camera.java(frameworksbasecorejavaandroidhardware)的takePicture方法
2. & & & 接着会调用到JNI层的android_hardware_Camera.cpp(frameworksbasecorejni)的android_hardware_Camera_takePicture方法,其中会通过get_native_camera获取一个Camera对象。
3. & & & 上述Camera对象的定义在Camera.h(frameworksavincludecamera),camera.h同时定义了CameraInfo。Camera对象继承自publicBnCameraClient,DeathRecipient。Camera对象的真正实现是在Camera.cpp(frameworksavcamera) & 。BnCameraClient是作为CameraService回调而存在的。Camera对象内含有一个mCameraService变量用于保存CameraService引用。
class Camera : public BnCameraClient,public IBinder::DeathRecipient
constsp&ICameraService&& Camera::getCameraService()
& & Mutex::Autolock _l(mLock);
& & if (mCameraService.get() == 0) {
& & & & sp&IServiceManager& sm = defaultServiceManager();
& & & & sp&IBinder&
& & & & do {
& & & & & & binder =sm-&getService(String16(&media.camera&));
& & & & & & if (binder != 0)
& & & & & & & &
& & & & & & ALOGW(&CameraService notpublished, waiting...&);
& & & & & & usleep(500000); // 0.5 s
& & & & } while(true);
& & & & if (mDeathNotifier == NULL) {
& & & & & & mDeathNotifier = newDeathNotifier();
& & & & binder-&linkToDeath(mDeathNotifier);
& & & & mCameraService =interface_cast&ICameraService&(binder);
4. & & & 在ICameraClient.h和ICameraService.h文件中,ICameraClient和ICameraService都继承自IInterface,也就是Binder通信的基础,此外ICamera.h也继承自IInterface
class ICameraClient:public IInterface
class ICameraService :public IInterface
class ICamera: publicIInterface
然后发现BnCameraClient继承自BnInterface&ICameraClient&,作为ICameraClient的服务器端存在:
class BnCameraClient: publicBnInterface&ICameraClient&
BnCameraService继承自BnInterface&ICameraService&,作为ICameraService的服务器端存在:
class BnCameraService: publicBnInterface&ICameraService&
BnCamera继承自BnInterface&ICamera&,作为ICamera的服务器端存在:
class BnCamera: public BnInterface&ICamera&
对应的上述三个分别存在一个作为Binder客户端的类存在,为Bp***:
class BpCameraClient:public BpInterface&ICameraClient&
class BpCameraService:public BpInterface&ICameraService&
class BpCamera: publicBpInterface&ICamera&
上述三个的实现分别在ICameraClient.cpp、ICameraService.cpp、ICamera.cpp,在这三支文件中分别实现了三组Binder的Server端和Client端,Camera常用的方法都在ICamera中实现。
5. & & & Camera.cpp文件connect方法在JNI层去setupCamera的时候会调用,JNI层是在上层opencamera的时候被调用的,在camera.cpp的connect方法中获取一个ICamera对象来完成对Camera的真正操作。
sp&Camera&Camera::connect(int cameraId)
& & ALOGV(&connect&);
& & sp&Camera& c = new Camera();
& & const sp&ICameraService&& cs =getCameraService();
& & if (cs != 0) {
& & & & c-&mCamera = cs-&connect(c, cameraId);
& & if (c-&mCamera != 0) {
& & & &c-&mCamera-&asBinder()-&linkToDeath(c);
& & & & c-&mStatus = NO_ERROR;
& & } else {
& & & & c.clear();
6. & & & 在CameraService.h文件中可以看到CameraService定义内部类Client,CameraClient继承此类,在CameraService中持有对mClient对象的一个数组,这个数组也是Camera.cpp客户端调用connect方法后需要返回的Binder引用对象
&class Client : public BnCamera
class CameraClient : public CameraService::Client
wp&Client& & & & & mClient[MAX_CAMERAS];
& & switch(deviceVersion) {
& & & case CAMERA_DEVICE_API_VERSION_1_0:
& & & & client = new CameraClient(this,cameraClient, cameraId,
& & & & & & & & info.facing, callingPid, getpid());
& & & case CAMERA_DEVICE_API_VERSION_2_0:
& & & & client = new Camera2Client(this,cameraClient, cameraId,
& & & & & & & & info.facing, callingPid,getpid());
并且Google好像有开发新的API2.0,在此处通过判断不同的version实例化不同的CameraClient的Binder引用对象回去,目前Camera2文件夹有Burst等实现
7. & & & 在CameraService层的CameraClient对象的定义中,持有CameraHardwareInterface对象的引用mHardware.在CameraClient的initilize方法中会创建此对象,在对象的构造方法中传入需要打开的Camera的ID。
sp&CameraHardwareInterface& & & mH
status_t CameraClient::initialize(camera_module_t *module) {
& & int callingPid = getCallingPid();
& & LOG1(&CameraClient::initialize E (pid%d, id %d)&, callingPid, mCameraId);
& & char camera_device_name[10];
& & status_
& & snprintf(camera_device_name, sizeof(camera_device_name),&%d&, mCameraId);
& & mHardware = new CameraHardwareInterface(camera_device_name);
& & res = mHardware-&initialize(&module-&common);
& & if (res != OK) {
& & & & ALOGE(&%s: Camera %d: unable toinitialize device: %s (%d)&,
& & & & & & & & __FUNCTION__, mCameraId,strerror(-res), res);
& & & & mHardware.clear();
& & & & return NO_INIT;
& & mHardware-&setCallbacks(notifyCallback,
& & & & & &dataCallback,
& & & & & &dataCallbackTimestamp,
& & & & & & (void*)mCameraId);
& & //Enable zoom, error, focus, and metadata messages by default
& & enableMsgType(CAMERA_MSG_ERROR | CAMERA_MSG_ZOOM | CAMERA_MSG_FOCUS |
& & & & & & & & &CAMERA_MSG_PREVIEW_METADATA | CAMERA_MSG_FOCUS_MOVE);
//!++
#ifdef &MTK_CAMERA_BSP_SUPPORT
& & // Enable MTK-extended messages by default
& & enableMsgType(MTK_CAMERA_MSG_EXT_NOTIFY |MTK_CAMERA_MSG_EXT_DATA);
& & LOG1(&CameraClient::initialize X (pid%d, id %d)&, callingPid, mCameraId);
& & return OK;
8. & & & 在CameraService的onFirstRef方法中,会加载CameraHal &Module
void CameraService:: onFirstRef()
& & BnCameraService::onFirstRef();
& & if (hw_get_module(CAMERA_HARDWARE_MODULE_ID,
& & & & & & & & (const hw_module_t**)&mModule) & 0) {
& & & & ALOGE(&Could not load camera HALmodule&);
& & & & mNumberOfCameras = 0;
& & else {
& & & & mNumberOfCameras =mModule-&get_number_of_cameras();
& & & & if (mNumberOfCameras & MAX_CAMERAS){
& & & & & & ALOGE(&Number of cameras(%d)& MAX_CAMERAS(%d).&,
& & & & & & & & & & mNumberOfCameras, MAX_CAMERAS);
& & & & & & mNumberOfCameras = MAX_CAMERAS;
& & & & for (int i = 0; i &mNumberOfC i++) {
& & & & & & setCameraFree(i);
hw_get_module方法的实现在hardware/libhardware/Hardware.c文件中实现
int hw_get_module(constchar *id, const struct hw_module_t **module)
& & return hw_get_module_by_class(id, NULL,module);
Camera_module_t的结构体定义在camera_common.h文件中
typedef structcamera_module {
& & hw_module_
& & int (*get_number_of_cameras)(void);
& & int (*get_camera_info)(int camera_id,struct camera_info *info);
} camera_module_t;
Hw_module_t的定义在hardware.h文件中,hw_module_t持有对hw_module_methods_t引用,其中有定义一个open指针
typedef structhw_module_methods_t {
& & /** Open a specific device */
& & int (*open)(const struct hw_module_t*module, const char* id,
& & & & & & struct hw_device_t** device);
} hw_module_methods_t;
而加载CamDevice的操作是在CameraHardwareInterface的initialize方法中调用open
& & status_t initialize(hw_module_t *module)
& & & & ALOGI(&Opening camera %s&, mName.string());
& & & & int rc = module-&methods-&open(module, mName.string(),
& & & & & & & & & & & & & & & & & & & &(hw_device_t **)&mDevice);
& & & & if (rc != OK) {
& & & & & & ALOGE(&Could not open camera %s: %d&, mName.string(), rc);
& & & & & &
& & & & initHalPreviewWindow();
CameraClient::initialize-&&
mHardware = new CameraHardwareInterface(camera_device_name);
res = mHardware-&initialize(&module-&common);
以下转自:http://www./lib/view/open3.html
android camera介绍
Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程:一个是 client 进&
程,可以看成是 AP 端,主要包括 JAVA 代码与一些 native c/c++代码;另一个是 service 进&
程,属于服务端,是 native c/c++代码,主要负责和 linux kernel 中的 camera driver 交互,搜&
集 linux kernel 中 camera driver 传上来的数据,并交给显示系统(surface)显示。client 进程与&
service 进程通过 Binder 机制通信,&&&&&& client 端通过调用 service 端的接口实现各个具体的功能。&
需要注意的是真正的 preview 数据不会通过 Binder IPC 机制从 service 端复制到 client 端,&& 但&
会通过回调函数与消息的机制将 preview 数据 buffer 的地址传到 client 端, 最终可在 JAVA AP&
中操作处理这个 preview 数据。&
&&&&&&&& client 端&
从 JAVA AP 的角度看 camera ap 就是调用 FrameWork 层的 android.hardware.camera 类来实现&
具体的功能。JAVA Ap 最终被打包成 APK。&
FrameWork 层主要提供了 android.hardware.camera 类给应用层使用,这个类也是 JAVA 代码&
实 现 。 Android.hardware.camera 类 通 过 JNI 调 用 native 代 码 实 现 具 体 的 功 能 。&
Android.hardware.camera 类中提供了如下的一个参数类给应用层使用:&
public class Parameters {&
&&&&&&& // Parameter keys to communicate with the camera driver。&
&&&&&&& private static final String KEY_PREVIEW_SIZE = &preview-size&;&
&&&&&&& private static final String KEY_PREVIEW_FORMAT = &preview-format&;&
&&&&&&& ......&
参数会以字典(map)的方式组织存储起来,关键字就是 Parameters 类中的这些静态字符&
串。这些参数最终会以形如“preview-size=640X480;preview-format=yuv422....”格式的&
字符串传到 service 端。&&&& 源代码位于:framework/base/core/java/android/hardware/camera.java&
提供的接口示例:
获得一个 android.hardware.camera 类的实例
public static Camera open() {&
&&&&&&& return new Camera();&
&接口直接调用 native 代码(android_hardware_camera.cpp 中的代码)&
public native final void startPreview();&
public native final void stopPreview();&
android.hardware.camera 类的 JNI 调用实现在 android_hardware_camera.cpp 文件中,源代码&
位置:& framework/base/core/jni/android_hardware_camera.cpp&
(framework/base/core/jni/文件夹下的文件都被编译进 libandroid_runtime.so 公共库中& )&
android_hardware_camera.cpp 文件中的 JNI 调用实现函数都如下图:
android_hardware_camera.cpp 文件中的 register_android_hardware_Camera(JNIEnv *env)函数&
会将上面的 native 函数注册到虚拟机中,以供 FrameWork 层的 JAVA 代码调用。这些 native&
函数通过调用 libcamera_client.so 中的 Camera 类实现具体的功能。&
核心的 libcamera_client.so 动态库源代码位于:&& frameworks/base/libs/camera/,& 实现了如下几&
&Camera----&Camera.cpp/Camera.h&
&CameraParameters---&CameraParameters.cpp/CameraParameters.h&
&Icamera---&ICamera.cpp/ICamera.h&
&IcameraClient---&ICameraClient.cpp/ICameraClient.h&
&IcameraService---&ICameraService.cpp/ICameraService.h&
Icamera、IcameraClient、IcameraService 三个类是按照 Binder IPC 通信要求的框架实现的,用&
来与 service 端通信。&
类 CameraParameters 接收 FrameWork 层的 android.hardware.camera::Parameters 类为参数,&
解析与格式化所有的参数设置。&
Camera 是一个很重要的类,&&&& 它与 CameraService 端通过 Binder IPC 机制交互来实现具体功能。&
Camera 继承自 BnCameraClient,并最终继承自 ICameraClient。&
Camera 类通过:&
sp&sm = defaultServiceManager();&
sp&binder = sm-&getService(String16(&media.camera&));&
sp&mCameraService = interface_cast&(binder);&
得到名字为“media.camera”的 CameraService。通过调用 CameraService 的接口 connect()返&
回得到 sp&mCamera,并在 CameraService 端 new 一个 CameraService::Client 类&
mClient。mClient 继承自 BnCamera,并最终继承自 ICamera。&
之 后 Camera 类 通 过 这 个 sp&mCamera 对 象 调 用 函 数 就 像 直 接 调 用&
CameraService::Client 类 mClient 的函数。CameraService::Client 类实现具体的功能。&
&&&&&&&&& service 端&
实现在动态库 libcameraservice.so 中,& 源代码位于:& frameworks/base/camera/libcameraservice
Libcameraservice.so 中主要有下面两个类:&
Libcameraservice.so::CameraService 类 , 继 承 自 BnCameraService , 并 最 终 继 承 自&
&&&& ICameraService&
& Libcameraservice.so::CameraService::Client 类, 继承自 BnCamera,&&& 并最终继承自 ICamera&
CameraService::Client 类通过调用 Camera HAL 层来实现具体的功能。目前的 code 中只支持&
一个 CameraService::Client 实例。&
Camera Service 在 系 统 启 动 时 new 了 一 个 实 例 , 以 “ media.camera ” 为 名 字 注 册 到&
ServiceManager 中。在 init.rc 中有如下代码执行可执行文件/system/bin/mediaserver,启动多&
媒体服务进程。&
service media /system/bin/mediaserver&
Mediaserver 的 c 代码如下:&
int main(int argc,char** argv)&
&&& sp&proc(ProcessState::self());&
&&& sp&sm = defaultServiceManager();&
&&& LOGI(&ServiceManager: %p&,sm。get());&
&&& AudioFlinger::instantiate();&
&&& MediaPlayerService::instantiate();&
&&& CameraService::instantiate();&
&&& AudioPolicyService::instantiate();&
&&& ProcessState::self()-&startThreadPool();&
&&& IPCThreadState::self()-&joinThreadPool();&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&Camera HAL(硬件抽象层)&
Libcameraservice.so::CameraService::Client 类调用 camera HAL 的代码实现具体功能,camera&
HAL 一般实现为一个动态库 libcamera.so(动态库名字可以改,只需要与 Android.mk 一致即&
可)。Android 只给了一个定义文件:&
/home/miracle/Work/android/android_src/froyo/frameworks/base/include/camera/CameraHard&
wareInterface.h&
class CameraHardwareInterface : public virtual RefBase {&
&&&& virtual ~CameraHardwareInterface() { }&
&&&& virtual sp&getPreviewHeap() const = 0;&
&&&& virtual sp&getRawHeap() const = 0;&
&&&& virtual void setCallbacks(notify_callback notify_cb,data_callback data_cb,&
&&&&&&&&&&&&&&&&&&&& data_callback_timestamp data_cb_timestamp,void* user) = 0;&
&&&& virtual void&&&&&& enableMsgType(int32_t msgType) = 0;&
&&&& virtual void&&&&&& disableMsgType(int32_t msgType) = 0;&
&&&& virtual bool&&&&&& msgTypeEnabled(int32_t msgType) = 0;&
&&&& virtual status_t startPreview() = 0;&
&&&& virtual bool&&&&&&& useOverlay() {}&
&&&& virtual status_t setOverlay(const sp&&overlay) {return BAD_VALUE;}&
&&&& virtual void&&&&&&&& stopPreview() = 0;&
&&&& virtual bool&&&&&&&& previewEnabled() = 0;&
&&&& virtual status_t&&&&& startRecording() = 0;&
&&&& virtual bool&&&&&&&& recordingEnabled() = 0;&
&&&& virtual status_t&&&&& autoFocus() = 0;&
&&&& virtual status_t&&&&& cancelAutoFocus() = 0;&
&&&& virtual status_t&&&&& takePicture() = 0;&
&&&& virtual status_t&&&&& cancelPicture() = 0;&
&&&& virtual status_t&&&&& setParameters(const CameraParameters& params) = 0;&
&&&& virtual CameraParameters getParameters() const = 0;&
&&&& virtual status_t sendCommand(int32_t cmd,int32_t arg1,int32_t arg2) = 0;&
&&&& virtual void release() = 0;&
&&&& virtual status_t dump(int fd,const Vector&& args) const = 0;&
extern &C& sp&openCameraHardware();&
}; // namespace android&
可以看到在 JAVA Ap 中的功能调用最终会调用到 HAL 层这里,Camera HAL 层的实现是主要&
的工作,&&&&& 它一般通过 V4L2 command 从 linux kernel 中的 camera driver 得到 preview 数据。然&
后交给 surface(overlay)显示或者保存为文件。在 HAL 层需要打开对应的设备文件,并通过&
ioctrl 访问 camera driver。Android 通过这个 HAL 层来保证底层硬件(驱动)改变,只需修改&
对应的 HAL 层代码,FrameWork 层与 JAVA Ap 的都不用改变。&
&&&&&&&&&& Preview 数据流程&
Android 框架中 preview 数据的显示过程如下:&
1、 打开内核设备文件。CameraHardwareInterface.h 中定义的 openCameraHardware()打开&
&&&&& linux kernel 中的 camera driver 的设备文件(如/dev/video0)&&&&& ,创建初始化一些相关的类&
&&&&& 的实例。&
2、 设置摄像头的工作参数。CameraHardwareInterface.h 中定义的 setParameters()函数,在&
&&&&& 这一步可以通过参数告诉 camera HAL 使用哪一个硬件摄像头,& 以及它工作的参数& (size,&
&&& format 等) ,并在 HAL 层分配存储 preview 数据的 buffers(如果 buffers 是在 linux kernel&
&&& 中的 camera driver 中分配的,在这一步也会拿到这些 buffers mmap 后的地址指针)&&&&&&&&&&&&&&&&&&&&& 。&
3、 设置显示目标。需在 JAVA APP 中创建一个 surface 然后传递到 CameraService 中。会调&
&&& 用到 libcameraservice.so 中的 setPreviewDisplay(const sp&& surface)函数中。在&
&&& 这里分两种情况考虑:一种是不使用一种是使用 overlay 显示。如果不使用&
&&& overlay 那设置显示目标最后就在 libcameraservice.so 中,不会进 Camera HAL 动态库。&
&&& 并将上一步拿到的 preview 数据 buffers 地址注册到 surface 中。 如果使用 overlay 那在&
&&& libcameraservice.so 中会通过传进来的 Isurface 创建 Overlay 类的实例,然后调用&
&&& CameraHardwareInterface.h 中定义的 setOverlay()设置到 Camera HAL 动态库中。&
4、 开始 preview 工作。最终调用到 CameraHardwareInterface.h 中定义的 startPreview()函数。&
&&& 如果不使用 overlay,Camera HAL 得到 linux kernel 中的 preview 数据后回调通知到&
&&& libcameraservice.so 中。在 libcameraservice.so 中会使用上一步的 surface 进行显示。如&
&&& 果使用 overlay,&&& Camera HAL 得到 linux kernel 中的 preview 数据后直接交给 Overlay 对象,&
&&& 然后有 Overlay HAL 去显示。&
&&&&&&&& 模拟器中的虚拟 camera&
如果没有 camera 硬件,不实现真正的 Camera HAL 动态库,可以使用虚拟 camera。源代码&
frameworks/base/camera/libcameraservice/FakeCamera.cpp&
frameworks/base/camera/libcameraservice/CameraHardwareStub.cpp&
FakeCamera.cpp 文件提供虚拟的 preview 数据。CameraHardwareStub.cpp 文件中实现了&
camera HAL(硬件抽象层)的功能。当宏 USE_CAMERA_STUB 为 true 时可以使用这个虚拟的&
ifeq ($(USE_CAMERA_STUB),true)&
&&& LOCAL_STATIC_LIBRARIES += libcamerastub //虚拟的 camera&
#if want show LOGV message,should use follow define。 add 0929&
#LOCAL_CFLAGS += -DLOG_NDEBUG=0&
&&& LOCAL_CFLAGS += -include CameraHardwareStub。h&
&&& LOCAL_SHARED_LIBRARIES += libcamera //真正的 camera HAL 库&
&&&&&&&&&& 框架图
&&&&&&&&&& Overlay 简单介绍&
overlay 一般用在 camera preview,视频播放等需要高帧率的地方,还有可能 UI 界面设计&
的需求, 如map 地图查看软件需两层显示信息。 overlay 需要硬件与驱动的支持。& Overlay 没&
有 java 层的 code,也就没有 JNI 调用。一般都在 native 中使用。&
Overlay 的使用方法&
1. 头文件&
overlay object 对外的接口&
下面三个用于从 HAL 得到 overlay object&
&& 2.& 相关动态库文件&
libsurfaceflinger_client.so&
&&& 3.& 调用步骤&
& 创建 surfaceflinger 的客户端&
sp&client = new SurfaceComposerClient();&
&& 创建推模式 surface&
sp&surface = client-&createSurface(getpid(),0,320,240,&
PIXEL_FORMAT_UNKNOWN,IsurfaceComposer::ePushBuffers);&
& 获得 surface 接口&
sp&isurface = surface-&getISurface();&
&& 获得 overlay 设备&
sp&ref = isurface-&createOverlay(320,240,PIXEL_FORMAT_RGB_565);&
这里会通过调用 overlay hal 层的 createoverlay()打开对应的设备文件。&
& 创建 overlay 对象&
sp&overlay = new Overlay(ref);&
&& 使用 overlay API&
overlay_buffer_ //typedef void* overlay_buffer_t;&
void* address = overlay-&getBufferAddress(buffer);&
address 指针就是 mmap 后的 overlay buffer 指针,&& 只需将数据填充到这个 address 指针就可&
以看到画面了。&
Android overlay 框架&
overlay 本地框架代码&
源代码位于:frameworks/base/libs/ui/ ,编译到 libui.so 中。&
& Overlay.cpp : 提 供 给 外 部 程 序 调 用 的 Overlay object 接 口 与 API 。 定 义 在&
&&&&& frameworks/base/include/ui/Overlay.h 中。实现了两个类:OverlayRef 与 Overlay。外部&
&&&&& 程序通过这个 Overlay 对象来使用 overlay 的功能。Overlay.cpp 内部通过 binder 与&
&&&&& surfaceFlinger service 通信,最终调用到 Overlay HAL。&
&IOVerlay.cpp:& 定义提供 binder 所需的类,&&&&&&& 其中 LayerBuffer::OverlaySource::OverlayChannel&
& 继承自 BnOverlay。&
overlay 的服务部分代码&
源代码位于:frameworks/base/libs/surfaceflinger/&
overlay 系统被包在 Surface 系统中, 通过 surface 来控制 overlay 或者在不使用 overlay 的情&
况下统一的来管理。所以 overlay 的 service 部分也包含在 SurfaceFlinger service 中,主要的&
类 LayerBuffer。&
android 启动的时候会启动 SurfaceFlinger service,SurfaceFlinger 启动时会实例化一个&
DisplayHardware:&
DisplayHardware* const hw = new DisplayHardware(this,dpy);&
DisplayHardware 构造函数调用函数 init:&
DisplayHardware::DisplayHardware(const sp&& flinger,&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& uint32_t dpy)&
: DisplayHardwareBase(flinger,dpy)&
& init(dpy);&
Init 函数中:&
if(hw_get_module(OVERLAY_HARDWARE_MODULE_ID,&module) == 0) {&
&&&& overlay_control_open(module,&mOverlayEngine);&
获得 overlay 的 module 参数,&&&&&& 调用 overlay_control_open 获取控制设备结构 mOverlayEngine。&
拥有了控制设备结构体就可以创建数据设备结构体 ,并具体控制使用 overlay 了。&
overlay HAL 层&
源代码位于:hardware/libhardware/include/hardware/overlay.h&
android 只给出了接口的定义,需要我们自己实现具体的功能。 overlay hal 层生成的动态库&
在 SurfaceFlinger 中显式的加载。Overlay HAL 层具体功能如何实现取决于硬件与驱动程序。&
Android 提供了一个 Overlay Hal 层实现的框架代码,&&&&&&&&&&&&&&& hardware/libhardware/modules/overlay/。&
因为 overlay hal 层生成的动态库是显式的动态打开(hw_get_module -& dlopen),所以这个库&
文件必须放在文件系统的 system/lib/hw/下。&
多层 overlay&
例如需要同时支持 overlay1 与 overlay2。&
&1. overlay hal 的 overlay_control_device_t 中要添加 overlay1 与 overlay2 的结构:&
struct overlay_control_context_t {&
&& struct overlay_control_device_&
&& /* our private state goes below here */&
&& struct overlay_t* overlay_video1;//overlay1&
&& struct overlay_t* overlay_video2;//overlay2&
每个 overlay_t 代表一层 overlay,每层 ovelay 有自己的 handle。&
在构造 OverlayRef 之前需指明使用哪一层 overlay:&
sp&ref = isurface-&createOverlay(320,240,PIXEL_FORMAT_RGB_565);&
可以使用自定义参数调用 overlay_control_device_t::setParameter()来指定 Hal 层具体实现。&
2,通过 Overlay object 来拿到 overlay1 与 overlay2 的 buffer 指针。
延伸阅读:
热门搜索:
特色栏目:
类别推荐:

我要回帖

更多关于 图片去水印工具 的文章

 

随机推荐