CN103491298B - 多区域实时合成拍照方法及触控终端 - Google Patents
多区域实时合成拍照方法及触控终端 Download PDFInfo
- Publication number
- CN103491298B CN103491298B CN201310417157.XA CN201310417157A CN103491298B CN 103491298 B CN103491298 B CN 103491298B CN 201310417157 A CN201310417157 A CN 201310417157A CN 103491298 B CN103491298 B CN 103491298B
- Authority
- CN
- China
- Prior art keywords
- image
- bitmap
- region
- user
- regional
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Processing Or Creating Images (AREA)
- Image Processing (AREA)
Abstract
本发明公开了多区域实时合成拍照方法及触控终端,其中,多区域实时合成拍照方法包括:A、在预览界面上叠加拍照操作视图;B、接收用户的画线指令,根据用户所画线条将所述拍照操作视图分成若干个区域;C、接收用户在各个区域的拍照指令,记录各个区域的拍摄图像,并在所有区域拍摄完成后,将各区域记录的拍摄图像合成为一张图像。本发明提供的多区域实时合成拍照方法及触控终端,用户可以将屏幕划分成自己希望的几个区域,用户点击某区域就能完成这个区域内的拍照,在各个区域完成拍照后对各区域的照片进行合成,实现了实时合成拍照。
Description
技术领域
本发明涉及通信技术领域,特别涉及一种多区域实时合成拍照方法及触控终端。
背景技术
目前,智能手机、PDA(Personal Digital Assistant, 掌上电脑)、数码相机等智能电子设备的处理能力已经比较强大,能够进行一些简单的图像处理工作。并且这些智能电子设备大多都带有摄像头和触摸屏,可以进行拍照,及方便用户对智能电子设备的操作。
但是这些智能电子设备的照相软件仅提供简单的拍摄照片的功能或进行一些事先设定好的简单变形处理或进行全景拍照,无法完成按用户自己的要求来把几次拍摄的照片按不同区域合成在一起形成新的照片的操作。譬如,如果用户想要拍摄出在同一张照片中同一个人物同时出现在两个及两个以上的地方的照片、或者希望在照片的角落里添加一些其它内容等,类似这样的合成操作时,现在的做法是:将拍好的照片拷贝到PC机(Personal Computer,个人计算机)上,通过PC机上安装的图像处理软件(如photeshop)来进行处理。此方式必须通过PC机实现,存在一定的局限性,使用起来不方便;而且由于图像是在后期处理,也失去实时进行合成拍照的趣味性。
有鉴于此,本发明提供一种多区域实时合成拍照方法及触控终端。
发明内容
鉴于上述现有技术的不足之处,本发明的目的在于提供一种多区域实时合成拍照方法及触控终端,以解决现有技术合成图像时,需要在拍摄图像之后通过PC机后期处理的,无法进行实时合成的问题。
为了达到上述目的,本发明采取了以下技术方案:
一种多区域实时合成拍照方法,其包括:
A、在预览界面上叠加拍照操作视图;
B、接收用户的画线指令,根据用户所画线条将所述拍照操作视图分成若干个区域;
C、接收用户在各个区域的拍照指令,记录各个区域的拍摄图像,并在所有区域拍摄完成后,将各区域记录的拍摄图像合成为一张图像。
所述的多区域实时合成拍照方法中,所述步骤A还包括:在所述拍照操作视图中保存一用于存储各个区域的拍摄图像数据的位图。
所述的多区域实时合成拍照方法中,所述步骤B具体包括:
B1、接收用户的画线指令,对用户所画线条做平滑处理;
B2、根据平滑处理后的线条将所述拍照操作视图分成若干个区域。
所述的多区域实时合成拍照方法中,所述步骤B1还包括:对用户所画线条的端点作修正处理。
所述的多区域实时合成拍照方法中,所述步骤C具体包括:
C1、当一个区域接收到用户输出的屏幕点击事件时,记录所拍摄图像;
C2、将所述拍摄图像以触摸点为中心填充该触摸点所在区域,并统计已填充的像素点个数;
C3、当已填充的像素点的个数与位图中的像素点个数相同时,把位图中的拍摄图像数据封装成JPG格式的照片,使位图中各个区域存储的拍摄图像合成为一张图像。
所述的多区域实时合成拍照方法中,所述拍照操作视图为全透明视图。
一种用于实现上述多区域实时合成拍照方法的触控终端,其包括:
触控接收模块,用于接收触控事件;
显示模块,用于显示预览界面;
视图叠加模块,用于在预览界面上叠加拍照操作视图;
区域划分模块,用于接收用户的画线指令,根据用户所画线条将所述拍照操作视图分成若干个区域;
图像处理模块,用于接收用户在各个区域的拍照指令,记录各个区域的拍摄图像,并在所有区域拍摄完成后,将各区域记录的拍摄图像合成为一张图像。
所述的触控终端,还包括:位图,保存于所述拍照操作视图中,用于存储各个区域的拍摄图像数据。
所述的触控终端中,所述区域划分模块包括:
线条平滑处理单元,用于对用户所画线条做平滑处理;
区域划分单元,用于根据平滑处理后的线条将所述拍照操作视图分成若干个区域。
所述的触控终端中,所述图像处理模块包括:
图像记录单元,用于当一个区域接收到用户输出的屏幕点击事件时,记录所拍摄图像;
图像填充单元,用于将所述拍摄图像以触摸点为中心填充该触摸点所在区域;
计数单元,用于统计已填充的像素点个数;
图像合成单元,用于当已填充的像素点的个数与位图中的像素点个数相同时,把位图中的拍摄图像数据封装成JPG格式的照片,使位图中各个区域存储的拍摄图像合成为一张图像。
相较于现有技术,本发明提供的多区域实时合成拍照方法及触控终端,用户可以将屏幕划分成自己希望的几个区域,用户点击某区域就能完成这个区域内的拍照,在各个区域完成拍照后对各区域的照片进行合成,实现了实时合成拍照。本发明的多区域实时合成拍照方法,其操作方式很容易被用户理解掌握,因而也就容易被用户接受。而且,用户也可以在照片合成前实时地看到合成后效果,实现了所见即得的好处,增加了用户体验效果。
附图说明
图1为本发明多区域实时合成拍照方法的流程图。
图2为本发明多区域实时合成拍照方法的示意图。
图3为本发明触控终端的结构框图。
具体实施方式
实时合成拍照与后期进行图片的处理不同,它要求在拍照的同时就进行合成,难度在于用户及时地把自己的创造性意图与触控终端进行交互,本发明通过用手指直接在屏幕上画线的方式来对画面进行切分,分成若干个小的区域,每个区域都能单独进行拍照以获取本区域对应的图像,这些被划分的区域在获取到对应的图像后,使图像覆盖在预览界面上,用户可以直接看到它与预览图像合成显示的效果,因此用户在拍下一个区域前就能知道拍出来的结果,这样就能使最终拍出来的照片与所希望合成的效果一致了。
为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
请参阅图1,其为本发明多区域实时合成拍照方法的流程图。如图1所示,本发明实施例提供的多区域实时合成拍照方法包括:
S100、在预览界面上叠加拍照操作视图。
本实施例中,所述拍照操作视图为全透明视图,本发明需要在预览界面上叠加一个全透明的拍照操作视图,以便于进行区域划分操作,由于该视图是透明的,在拍照之前只能看到预览界面。
S200、接收用户的画线指令,根据用户所画线条将所述拍照操作视图分成若干个区域。
如果用户需要进行实时合成拍照,在拍照前,需要在预览界面上通过手势在屏幕上画出线条,这些线条把屏幕上的预览界面上的视图分成若干个区域。
因此,所述步骤S200具体包括:第一步、接收用户的画线指令,对用户所画线条做平滑处理;第二步、根据平滑处理后的线条将所述拍照操作视图分成若干个区域。
其中,由于用户所画线条一般是不规则线条,其所画线条的端点并不一定在区域边界上,因此在对每一条用户所画线条做平滑处理之前,需要对该用户所画线条的端点作修正处理,然后可再画其它线。譬如,如果用户只画了一条线,可以只做线条起点和终点接近视图边界的修正处理,使该线条将预览界面划分成两个区域;如果线段的起点或者终点太接近视图的边界或者太接近某条已经画出的线条,则认为该线条的起点或终点是在边界上或是在已画段上,据此对线段的起点或终点进行修正,使其在视图边界上或者在已画段上。
S300、接收用户在各个区域的拍照指令,记录各个区域的拍摄图像,并在所有区域拍摄完成后,将各区域记录的拍摄图像合成为一张图像。
其中,所述步骤S300具体包括:a、当一个区域接收到用户输出的屏幕点击事件时,记录所拍摄图像;b、将所述拍摄图像以触摸点为中心填充该触摸点所在区域,并统计已填充的像素点个数;c、当已填充的像素点的个数与位图中的像素点个数相同时,把位图中的拍摄图像数据封装成JPG格式的照片,使位图中各个区域存储的拍摄图像合成为一张图像。
具体来说,在区域划分完成后,如果用户点击其中的一个区域则系统会控制摄像头拍摄一张照片,但并不把照片全部显示出来,也不作生成缩略图等操作,只是把对应区域的图像内容取出来(即记录本次所拍摄的图像),放在拍照操作视图的对应区域中,同时也把这个区域的图像内容保存在一个临时文件(如BMP文件)中,这时用户看到的预览界面上对应的区域的内容就被固定下来了,此时可以看到刚拍的区域和预览界面合成的实时效果。
在抓取到图像后,以用户手指与屏幕的接触点的坐标为中心,向四周扩散填充该区域,而其它未拍照的区域仍然显示预览界面。当用户点击完所有的区域后,整个照片就拍摄完成了,这时临时文件(BMP文件)中就记录下了最终要生成照片的全部图像信息。然后把这个文件的内容封装成JPG文件后放在指定位置并刷新数据库存储照片,便完成了拍照合成过程。
在具体实施过程中,判断拍照是否完成,不需要触控终端统计有多少个区域完成了拍照,本发明只需通过在拍照后判断拍照操作视图上所有的像素点都被图像填充后就可以认为拍照完成,并执行后续的合成照片的工作。
为了实现上述的封装,所述步骤S100还包括在所述拍照操作视图中保存一用于存储各个区域的拍摄图像数据的bitmap(位图)。该bitmap的尺寸与所要拍摄的照片的大小一致,用以保存每次对某个区域拍照时的数据,并且这个bitmap的内容会在预览界面的视图上进行显示,因此这个bitmap的内容最初为全透明的,这样拍照操作视图在最初时才会是透明的。由于照片的拍摄尺寸和预览尺寸通常不一样大,预览尺寸通常要按比例缩小的,所以bitmap的尺寸和视图的尺寸通常也不一样,所以把bitmap显示在视图上时也要按比例进行显示。
本发明提供一种多区域实时合成拍照方法,通过多次拍照得到多张照片,每次拍照只保留一部分,保留的部分由用户事先划定的区域来决定,最后把各个部分拼接成一张完整的图片。本发明通过把拍摄区域的图片与预览界面的实时画面重叠显示,用户可以在拍下一张照片前就可以知道拍出来的效果,其直观效果好,实现了所见即得的好处。
以下例举具体实施例,对本发明的操作过程进行详细说明:
如图2中的(a)部分所示,用手指在预览界面上的左上角画线,将预览界面划分为两个区域。应当说明的是,此处的预览界面在实际使用时是能看到图像的预览界面,本实施例为了与下述区域拍照的图像区分,所以并未画出其预览图像。
为实现区域划分功能,首先需要在预览界面上放置一个单独的拍照操作视图,当手指在屏幕上滑动的时候,根据相应的坐标点,在这个拍照操作视图上画出对应的线条。由于手指滑动时坐标点并不规则,所以需要对线条进行必要的平滑处理。画线时,当手指指向某一已有线条时,其坐标点(该线条起点或终点的坐标点)并不一定刚好在这条线上,如果这个点正好是刚要画的线段的起点或者终点时,用户的意图应当是将所要画的线要与已有画线相交,因此必须对这个点进行修正,使该点修正到该线段上。
在需要合成拍照时,用户只需用手指点击其中的一个区域,如图2中的(b)部分所示的区域。在此动作的拍照完成后,在bitmap中记录所拍摄的图像数据。如果用户不满意本次拍摄的图像,在对下一个区域输入拍照动作之前还可以放弃本次拍照,在放弃后,该区域返回预临览界面,可再次输入拍照动作。
如图2中的(c)部分所示,用户用手指点击另一个区域,在确认此区域的图像之后[如图2中的(C)中手指触摸的区域显示的图像为用户确认的图像],对两次拍照的内容进行合成,合成为一张新的照片,实现了实时合成拍照,增加了用户拍照时的创造性意图。当然,在拍照时用户也可以先选择右侧区域拍照,然后在左上角区域拍照,再合成。
为了便于更好的理解本发明,以下对本发明的实施过程进行详细说明:
一、画线及触控事件处理
1.1、预览界面上的拍照操作视图——合成视图
照相软件的预览界面显示的是摄像头实时获取到的图像,本发明在预览界面上覆盖了一层拍照操作视图,这张拍照操作视图在初始时为全透明视图,这样就不会影响到用户观看预览界面,且该视图的尺寸与预览界面大小一致,使拍照操作视图完全覆盖预览界面。并且,在该拍照操作视图中保存一个bitmap(位图),且该bitmap在初始时也是透明的,用来存储每个区域所拍摄图像的图像数据。
以android系统为例,该拍照操作视图的实现方式如下:
public class compositeView extends View { //合成视图定义
***
private Bitmap bitmap; //缓存和显示区域边界线及已完成拍照区域的内容的位图
private Rect src; //用于画面缩放
private Rect dst; //用于画面缩放
//生成类及尺寸变化时会调用以下函数
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if ((bitmap == null)) {
int picW = getPictureWidth(); //获取要拍的照片的宽
int picH = getPictureHight(); //获取要拍的照片的高
bitmap = Bitmap.createBitmap(picW, picH, //设置位图
Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(bitmap); //定义画板
mCanvas.drawColor(255<<24); //把位图设置为透明
***
dst = new Rect(0,0,w,h); //用于画面缩放,设置目标大小
src = new Rect(0,0,picW,picH); //用于画面缩放,设置源大小
}
}
@Override
public void onDraw(Canvas canvas) { //视图显示时画图的函数
super.onDraw(canvas);
canvas.save(); //保存画板状态
if (bitmap != null) {
canvas.drawBitmap(bitmap, src, dst, null); //把位图内容画在画板上
}
canvas.restore(); //恢复画板状态
}
@Override
public boolean onTouchEvent(MotionEvent event) {***} //用于处理画线及拍照指令输入
}
上述代码中,在drawBitmap(bitmap,src,dst,null)函数中,把bitmap中的内容显示出来,这个函数中带有两个源大小及目标大小的参数分别为:“src,dst”,可以把bitmap的内容进行缩放。onTouchEvent()函数主要用于接收用户的触屏指令。
1.2、画线——区域边界
在进行区域划分时,需要用户用手指在屏幕上沟画出区域的边界,通过以上描述可知,bitmap(位图)中最初始的值全是透明的,即所有的点值全为FF000000(十六进制)。
在画线时,本实施例需要设置一个特殊的颜色(如红色)来画线,并以此颜色来区分区域和区域边界线,具体函数如下:
private int mLineColor = 0x80F00000; //红色半透明的边界线。
为此本实施例需要设置一个画笔,具体函数如下:
private Paint mPaint = new Paint(Paint.DITHER_FLAG);
把画笔的颜色设定为需要的颜色:
mPaint.setColor(mLineColor);
为了在bitmap上画出线条,本实施例还需要定义画笔的路径,具体如下:
private Path mPath = new Path();
在这之后,当需要画线时只要调用以下函数就可以实现画线功能:
mCanvas.drawPath(mPath, mPaint);
因此,画线所要做的工作主要集中在画笔路径的设置,当在触摸屏上输入了点之后,就对画笔路径进行了更新,便可以画出线条。具体画线代码如后述“画线及触控事件处理代码”所示。
1.3、端点修正
如果线段的起点或终点太接近视图的边界或者某条已经画出的线条,则认为这个线条的起点或终点在边界上或已画线条上,具体实施过程如下:
boolean closeToLine(int x, int y, Point point) {
int[] pixs = new int[bitmap.getHight()*bitmap.getWidth()]; //用于存贮bitmap的像素点
bitmap.getPixels(pixs, 0, bitmap.getWidth(), //获取bitmap中的所有像素点
0, 0, bitmap.getHight(), bitmap.getWidth());
//从pixs中寻找离x,y点在5个像素以内的最近的颜色为mLineColor的点,值放在point中
return findNearestLine(x, y, point, pixs, mLineColor, 5);
}
此return findNearestLine()函数用来判断输入点x,y周围5个像素内是否是视图的边缘或已画线段,如果存在则把最近的点记录到参数point中,并返回真,否则为假。因此,本实施例判断的点是存在于bitmap中的像素点。
1.4、平滑处理
在平滑处理时,通过调用路径的函数quadTo()可以方便地对输入的点进行平滑处理,在修正端点之后,通过quadTo()函数平滑地设置画线路径,之后把线画到bitmap中,并记录线条移动的范围大小,更新屏幕显示。具体如后述“画线及触控事件处理代码”所示。
1.5、区分画线与点击事件
当发生用户点击屏幕事件时,手指在屏幕上移动的距离很短,本实施例利用这一特性来区分画线事件和点击拍照事件。为了计算手指在屏幕上的滑动距离,本发明记录下每次触控事件的点,并计算这些点在屏幕上对应的矩形范围,当矩形的长与宽之和小于阈值时,表示屏幕点击事件;当矩形的长与宽之和大于或等于阈值时表示画线事件,具体如下:
void updateDrawZone(int x, int y, Rect drawZone, Boolean newPoint) {
if (new Point) {
drawZone = new Rect(x,y,x,y); //如果是新的点,则新建矩形
} else if (!drawZone.contains(x, y)) {
drawZone.union(x,y); //如果新加的点没有在矩形内,则调整矩形
}
}
经过函数drawZone.union()处理后,所有的点都在drawZone所描述的矩形范围内。
因此,本实施例只需要计算这个矩形的长和宽相加的值就可以得到线段移动的范围了,如果小于阈值则认为是屏幕点击事件,并触发拍照事件,如:
boolean DrawTooShort(Rect zone) {
if ((zone.height() + zone.width()) < MINDISTANCE) return true; 距离太短,返回真
else return false; //返回假
}
其中,MINDISTANCE为最小移动距离的阈值,区分画线与点击事件具体的判断如后述“画线及触控事件处理代码”所示。
1.6、画线及触控事件处理代码
在划分出区域后,用户点击其中一个区域,照相软件便控制摄像头抓取该区域的一张图像数据,在得到图像数据后,只需把该区域对应的图像保存下来,并覆盖该区域的图像内容,使之与预览图像合成显示,完成该区域的拍照,此时其它没有拍照的区域,则仍然显示预览界面。
画线及整个触控事件处理的函数主要集中在onTouchEvent()函数中,其函数代码如下:
private enum DrawStat {findPoint, drawLine, takePicture, end} //工作状态
private DrawStat mDrawStat = DrawStat.findPoint; //设置最初工作状态
private Rect drawZone = null; //线条大小的范围
@Override
public boolean onTouchEvent(MotionEvent event) { //触摸事件
super.onTouchEvent(event);
float x = event.getX()*xRat; //调整输入坐标的比例
float y = event.getY()*yRat; //调整输入坐标的比例
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: //如果是屏幕上的手指按下事件
if (mDrawStat == DrawStat.takePicture) break;//如果区域划分已线束处理拍照状态则不处理
mDrawStat = DrawStat.findPoint; //设置画区域的最初状态
Point point_line;
if (closeToLine(x, y, point_line)) { //修正端点
x = point_line.x; //修正端点
y = point_line.y; //修正端点
}
mPath.moveTo(x, y); //画线的起始点
lx = x;
ly = y;
updateDrawZone(x, y, drawZone, new); //记录线条移动的范围大小
break;
case MotionEvent.ACTION_MOVE: //如果是屏幕上的手指移动事件
if (mDrawStat == DrawStat.takePicture) break;//如果区域划分已线束处理拍照状态则不处理
//修正端点
if (mDrawStat == DrawStat.findPoint) { //如果画线还没开始则可修正端点
Point point_line;
if (closeToLine(x, y, point_line)) { //得到修正后的点
x = point_line.x;
y = point_line.y;
mPath.moveTo(x, y); //重设画线的起始点
lx = x;
ly = y;
updateDrawZone(x, y, drawZone, new); //记录线条移动的范围大小
break;
} else {
mDrawStat == DrawStat.drawLine; //此时已处理画线状态
}
}
mPath.quadTo(lx,ly,(lx+x)/2, (ly+y)/2); //平滑地设置画线路径
mCanvas.drawPath(mPath, mPaint); //把线画到bitmap中
lx = x;
ly = y;
updateDrawZone(x, y, drawZone, false); //记录线条移动的范围大小
invalidate(); //画线后更新屏幕
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: //如果是屏幕上的手指离开事件
updateDrawZone(x, y, drawZone, false);//记录线条移动的范围大小
//区分画线与点击事件
//区分出是否移动太短,则认为是点击事件
if (DrawTooShort(drawZone)||mDrawStat==DrawStat.takePicture) {
mDrawStat = DrawStat.takePicture; //更改状态为拍照状态
fillUpTheZone(x, y); //对所点的区域进行拍照填充
invalidate(); //更新屏幕
break;
}
Point point_line; //修正结束点
if (closeToLine(x, y, point_line)) { //修正结束点
x = point_line.x; //修正结束点
y = point_line.y; //修正结束点
}
mPath.lineTo(x, y); //画最后一个点
mCanvas.drawPath(mPath, mPaint);
invalidate(); //画线后更新屏幕
break;
}
return true;
}
当完成在拍照操作视图上画线后,若线段在拍照操作视图上对应的bitmap中的值为:mLineColor = 0x80F00000,而其它的点都为mLineColor =0xFF000000,则每一片连续的值为mLineColor =0xFF000000的点组成一个独立的区域(即拍照区域),而这些区域全是被值为mLineColor=0x80F00000的点分隔开。
二、拍照合成
当触控事件判断为屏幕点击事件后,就不能再进行画线操作了,而是开始各区域的拍照,并填充对应的区域。此时触屏事件只响应手指离开屏幕事件,当发生手指离开屏幕事件后,从摄像头按照相机程序获取到一张图像数据,并以手指最后离开屏幕的位置的坐标为起点,从该点开始向四周扩散,把图像数据写到拍照操作视图中的bitmap中的对应的值为0xFF000000的区域中,对该区域的像素点填充,每填充完一个区域后,判断所有被划分的区域是否完成填充,如果是则把位图数据封装成最后的JPG文件格式的照片。
2.1、图像数据获取
为了获取图像数据,本实施例需要在camera.java程序文件中增加接口函数:takeCompositePicture(),此函数用来进行拍照,并返回数据,该函数定义如下:
Bitmap takeCompositePicture(PictureCallback cb) {
***
mCameraDevice.takePicture(null, null, null, cb);//调用此函数拍照
***
}
调用此函数后当mCameraDevice获得到数据后,会调用PictureCallback对象cb的onPictureTaken函数。
从上述画线及触控事件处理代码中可以看到当点击屏幕后,会调用函数:fillUpTheZone(int x, int y)。本发明在此函数中调用takeCompositePicture()函数来获取图像数据,如下:
void fillUpTheZone(int x, int y) {
mCamera.takeCompositePicture(new jpgPictureCallback(x, y)); //调用camera的拍照接口进行拍照获取图像数据
}
这里新建的jpgPictureCallback类型就是刚才takePicture函数中的回调cb。
2.2、区域填充与边界处理
在上述图像数据获取中,当拍完照后系统会调用jpgPictureCallback对象的onPictureTaken回调接口,本实施例在此时进行对视图对应区域的填充。
jpgPictureCallback函数的定义为:
class jpgPictureCallback implements PictureCallback {
public void onPictureTaken(final byte[] jpegData, //当拍照完后,会自动调用这个函数接口
final android.hardware.Camera camera) {
int[] picturepixs = decodeJpgData(jpegData); //把jpg格式的数据转换为数组格式
int[] viewpixs = new int[bitmap.getHight()*bitmap.getWidth()]; //用于存贮bitmap的像素点的数组
bitmap.getPixels(viewpixs, 0, bitmap.getWidth(), //获取bitmap中的所有像素点
0, 0, bitmap.getHight(), bitmap.getWidth());
fill(x, y, mLineColor, viewpixs, picturepixs); //对界面区域进行填充
bitmap.setPixels(viewpixs, 0, bitmap.getWidth(), //把填充后的像素点设回到位图中
0, 0, bitmap.getHight(), bitmap.getWidth())
invalidate(); //刷新界面
if (copiedPixs == picW*picH) {
compositePicture(); //将bitmap中的图像生成jpg格式的文件并保存
mDrawStat = DrawStat.findPoint;//设置状态为开始状态
}
}
}
在jpgPictureCallback()函数中,本实施例首先把得到的图像数据解析成整数型的数组,然后调用fill()函数对所选定的区域进行填充。其中,fill()函数的定义如下:
private void fill(int x, int y, int lineColor, int[] viewpixs, int[]picture) {
if (x > width || y > hight || x < 0 || y < 0) return; //边界以后的点不进行操作
if (viewpixs[x*width + y] == 0xFF000000) { //如果是在区域内
viewpixs[x*width + y] = picture[x*width + y]; //把拍到的像素复制到这个区域的位图中
copiedPixs++; //统计已复制了的像素点
fill(x+1, y, lineColor, viewpixs, picture); //递归复制到右边的像素
fill(x-1, y, lineColor, viewpixs, picture); //递归复制到左边的像素
fill(x, y+1, lineColor, viewpixs, picture); //递归复制到下边的像素
fill(x, y-1, lineColor, viewpixs, picture); //递归复制到上边的像素
} else if (viewpixs[x*width + y] == lineColor) { //如果是边界
viewpixs[x*width + y] = picture[x*width + y]; //把拍到的像素复制到这个区域的位图中
copiedPixs++; //统计已复制了的像素点
}
}
本发明在填充图像数据时采用递归的方式,从触摸点开始向四周扩散,直到碰到区域边界时停止,通过此填充方式能把整个区域填充满,并且,在填充时边界线的线条位置也进行填充,保证在填充完成后,画面上的所有点都被填充完,以便于后述进行所有区域是否填充完成的判断。
2.3、完成判断及保存成照片文件
本实施例填充点击区域时,进行计数统计已填充的像素点的个数,当已填充了的像素点的个数与位图中的像素的个数相同时,就认为已完成了所有区域的填充。如上述2.2中的条件:copiedPixs == picW*picH。
当检测到已完成了对所有区域填充后,便可以把位图中的图像数据封装成jpg格式的文件,具体如下所示:
void compositePicture() {
ByteArrayOutputStream stream = new ByteArrayOutputStream(); //设置中间流
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); //把bitmap的像素点转成流
byte[] data = stream.toByteArray(); //获得经过jpg编码的数据
mCamera.storeImage(data, ***); //调用camera的函数接口保存文件
}
本发明还相应提供一种用于实现多区域实时合成拍照方法的触控终端,该触控终端包括智能手机、平板电脑和相机,如图3所示,其包括:触控接收模块10、显示模块20、视图叠加模块30、区域划分模块40和图像处理模块50。
其中,触控接收模块10为触摸屏,其位于显示模块20的上方,用于接收触控事件。显示模块20为液晶显示屏,用于显示预览界面及用户界面。视图叠加模块30用于在预览界面上叠加拍照操作视图。区域划分模块40用于接收用户的画线指令,根据用户所画线条将所述拍照操作视图分成若干个区域。图像处理模块50用于接收用户在各个区域的拍照指令,记录各个区域的拍摄图像,并在所有区域拍摄完成后,将各区域记录的拍摄图像合成为一张图像。具体如上述实施例所述。
具体实施时,所述区域划分模块40包括线条平滑处理单元和区域划分单元。所述线条平滑处理单元用于对用户所画线条做平滑处理;区域划分单元,用于根据平滑处理后的线条将所述拍照操作视图分成若干个区域。具体如上述实施例所述。
所述图像处理模块50包括图像记录单元、图像填充单元、计数单元和图像合成单元。其中,所述图像记录单元用于当一个区域接收到用户输出的屏幕点击事件时,记录所拍摄图像;所述图像填充单元用于将所述拍摄图像以触摸点为中心填充该触摸点所在区域;所述计数单元用于统计已填充的像素点个数;所述图像合成单元用于当已填充的像素点的个数与位图中的像素点个数相同时,把位图中的拍摄图像数据封装成JPG格式的照片,使位图中各个区域存储的拍摄图像合成为一张图像。具体如上述实施例所述。
进一步地,所述的触控终端还包括位图,保存于所述拍照操作视图中,用于存储各个区域的拍摄图像数据。
综上所述,本发明提供的多区域实时合成拍照方法及触控终端,用户可以将屏幕划分成自己希望的几个区域,用户点击某区域就能完成这个区域内的拍照,在各个区域完成拍照后对各区域的照片进行合成,实现了实时合成拍照。本发明的多区域实时合成拍照方法,其操作方式很容易被用户理解掌握,因而也就容易被用户接受。而且,用户也可以在照片合成前实时地看到合成后效果,实现了所见即得的好处,增加了用户体验效果。
可以理解的是,对本领域普通技术人员来说,可以根据本发明的技术方案及其发明构思加以等同替换或改变,而所有这些改变或替换都应属于本发明所附的权利要求的保护范围。
Claims (6)
1.一种多区域实时合成拍照方法,其特征在于,包括:
A、在预览界面上叠加拍照操作视图;
B、接收用户的画线指令,根据用户所画线条将所述拍照操作视图分成若干个区域;
C、接收用户在各个区域的拍照指令,记录各个区域的拍摄图像,并在所有区域拍摄完成后,将各区域记录的拍摄图像合成为一张图像;
所述步骤A还包括:在所述拍照操作视图中保存一用于存储各个区域的拍摄图像数据的位图;
所述步骤C具体包括:
C1、当一个区域接收到用户输出的屏幕点击事件时,记录所拍摄图像;
C2、将所述拍摄图像以触摸点为中心填充该触摸点所在区域,并统计已填充的像素点个数;
C3、当已填充的像素点的个数与位图中的像素点个数相同时,把位图中的拍摄图像数据封装成JPG格式的照片,使位图中各个区域存储的拍摄图像合成为一张图像。
2.根据权利要求1所述的多区域实时合成拍照方法,其特征在于,所述步骤B具体包括:
B1、接收用户的画线指令,对用户所画线条做平滑处理;
B2、根据平滑处理后的线条将所述拍照操作视图分成若干个区域。
3.根据权利要求2所述的多区域实时合成拍照方法,其特征在于,所述步骤B1还包括:对用户所画线条的端点作修正处理。
4.根据权利要求1所述的多区域实时合成拍照方法,其特征在于,所述拍照操作视图为全透明视图。
5.一种用于实现权利要求1所述多区域实时合成拍照方法的触控终端,其特征在于,包括:
触控接收模块,用于接收触控事件;
显示模块,用于显示预览界面;
视图叠加模块,用于在预览界面上叠加拍照操作视图;
区域划分模块,用于接收用户的画线指令,根据用户所画线条将所述拍照操作视图分成若干个区域;
图像处理模块,用于接收用户在各个区域的拍照指令,记录各个区域的拍摄图像,并在所有区域拍摄完成后,将各区域记录的拍摄图像合成为一张图像;
还包括:位图,保存于所述拍照操作视图中,用于存储各个区域的拍摄图像数据;
所述图像处理模块包括:
图像记录单元,用于当一个区域接收到用户输出的屏幕点击事件时,记录所拍摄图像;
图像填充单元,用于将所述拍摄图像以触摸点为中心填充该触摸点所在区域;
计数单元,用于统计已填充的像素点个数;
图像合成单元,用于当已填充的像素点的个数与位图中的像素点个数相同时,把位图中的拍摄图像数据封装成JPG格式的照片,使位图中各个区域存储的拍摄图像合成为一张图像。
6.根据权利要求5所述的触控终端,其特征在于,所述区域划分模块包括:
线条平滑处理单元,用于对用户所画线条做平滑处理;
区域划分单元,用于根据平滑处理后的线条将所述拍照操作视图分成若干个区域。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310417157.XA CN103491298B (zh) | 2013-09-13 | 2013-09-13 | 多区域实时合成拍照方法及触控终端 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310417157.XA CN103491298B (zh) | 2013-09-13 | 2013-09-13 | 多区域实时合成拍照方法及触控终端 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103491298A CN103491298A (zh) | 2014-01-01 |
CN103491298B true CN103491298B (zh) | 2017-01-25 |
Family
ID=49831231
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310417157.XA Active CN103491298B (zh) | 2013-09-13 | 2013-09-13 | 多区域实时合成拍照方法及触控终端 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103491298B (zh) |
Families Citing this family (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103945127A (zh) * | 2014-04-23 | 2014-07-23 | 深圳市金立通信设备有限公司 | 一种拍照的方法及终端 |
CN104967790B (zh) * | 2014-08-06 | 2018-09-11 | 腾讯科技(北京)有限公司 | 照片拍摄方法、装置及移动终端 |
CN104320590A (zh) * | 2014-11-19 | 2015-01-28 | 北京奇虎科技有限公司 | 一种分屏图像处理方法、装置及客户端 |
CN104333699A (zh) * | 2014-11-25 | 2015-02-04 | 广州视源电子科技股份有限公司 | 自定义拍照区域合成方法及装置 |
CN104539842B (zh) * | 2014-12-17 | 2018-02-13 | 宇龙计算机通信科技(深圳)有限公司 | 智能拍照方法及拍照装置 |
CN108353126B (zh) * | 2015-04-23 | 2019-08-23 | 苹果公司 | 处理相机的内容的方法、电子设备和计算机可读存储介质 |
CN104902184A (zh) * | 2015-05-28 | 2015-09-09 | 努比亚技术有限公司 | 一种多屏拍摄方法及多屏拍摄终端 |
CN105162978A (zh) * | 2015-08-26 | 2015-12-16 | 努比亚技术有限公司 | 拍照处理方法及装置 |
CN106572295A (zh) * | 2015-10-13 | 2017-04-19 | 阿里巴巴集团控股有限公司 | 一种图片处理方法及装置 |
US9854156B1 (en) | 2016-06-12 | 2017-12-26 | Apple Inc. | User interface for camera effects |
CN106791414B (zh) * | 2016-12-29 | 2019-11-08 | 努比亚技术有限公司 | 一种基于边缘输入的拍照合成装置及方法 |
CN106878799A (zh) * | 2017-02-21 | 2017-06-20 | 北京潘达互娱科技有限公司 | 一种动画显示方法及装置 |
CN107959755B (zh) * | 2017-11-27 | 2020-06-09 | 维沃移动通信有限公司 | 一种拍照方法、移动终端及计算机可读存储介质 |
CN107872623B (zh) * | 2017-12-22 | 2019-11-26 | 维沃移动通信有限公司 | 一种拍摄方法、移动终端及计算机可读存储介质 |
US11770601B2 (en) | 2019-05-06 | 2023-09-26 | Apple Inc. | User interfaces for capturing and managing visual media |
US10674072B1 (en) | 2019-05-06 | 2020-06-02 | Apple Inc. | User interfaces for capturing and managing visual media |
US11321857B2 (en) | 2018-09-28 | 2022-05-03 | Apple Inc. | Displaying and editing images with depth information |
US11128792B2 (en) | 2018-09-28 | 2021-09-21 | Apple Inc. | Capturing and displaying images with multiple focal planes |
CN109862267B (zh) | 2019-01-31 | 2020-11-17 | 维沃移动通信有限公司 | 一种拍摄方法及终端设备 |
US11706521B2 (en) | 2019-05-06 | 2023-07-18 | Apple Inc. | User interfaces for capturing and managing visual media |
CN110545385A (zh) * | 2019-09-23 | 2019-12-06 | 维沃移动通信有限公司 | 一种图像处理方法及终端设备 |
CN111050074A (zh) * | 2019-12-26 | 2020-04-21 | Tcl 移动通信科技(宁波)有限公司 | 基于终端的动态拍照处理方法、终端及可读存储介质 |
CN112004032B (zh) * | 2020-09-04 | 2022-02-18 | 北京字节跳动网络技术有限公司 | 视频处理方法、终端设备及存储介质 |
CN114727019A (zh) * | 2022-04-06 | 2022-07-08 | 广东小天才科技有限公司 | 一种图像拼接方法及装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5088017B2 (ja) * | 2007-06-28 | 2012-12-05 | ソニー株式会社 | 画像表示装置、撮像装置、画像表示方法、プログラム |
CN101382870A (zh) * | 2008-10-15 | 2009-03-11 | 深圳市杰特电信控股有限公司 | 一种电子绘图方法 |
CN102156606A (zh) * | 2010-11-17 | 2011-08-17 | 华为终端有限公司 | 取景框处理方法、图片处理方法和用户设备 |
CN103209291A (zh) * | 2012-01-17 | 2013-07-17 | 百度在线网络技术(北京)有限公司 | 一种用于控制自动拍摄图像的方法、装置和设备 |
CN102843514B (zh) * | 2012-08-13 | 2016-09-21 | 东莞宇龙通信科技有限公司 | 一种照片拍摄处理方法和移动终端 |
-
2013
- 2013-09-13 CN CN201310417157.XA patent/CN103491298B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN103491298A (zh) | 2014-01-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103491298B (zh) | 多区域实时合成拍照方法及触控终端 | |
KR101923788B1 (ko) | 인터랙티브 이미지 합성 | |
KR20140098009A (ko) | 컨텍스트 기반 카메라 콜라주를 생성하는 방법 및 시스템 | |
JP5347279B2 (ja) | 画像表示装置 | |
CN110072087B (zh) | 基于3d地图的摄像机联动方法、装置、设备及存储介质 | |
CN112135049B (zh) | 图像处理方法、装置及电子设备 | |
CN105933601A (zh) | 用于呈现突发图像的方法、装置和计算机程序产品 | |
CN102158648B (zh) | 影像截取装置及影像处理方法 | |
CN106657761A (zh) | 一种智能终端的拍照方法和装置 | |
CN105474626B (zh) | 摄像装置 | |
CN107623763A (zh) | 编辑图像的方法和装置 | |
US20200344411A1 (en) | Context-aware image filtering | |
CN106027902A (zh) | 一种拍照方法及移动终端 | |
CN113110731B (zh) | 媒体内容生成的方法和装置 | |
CN110248147B (zh) | 一种图像显示方法及装置 | |
CN107896306A (zh) | 一种滤镜拍照的方法及系统 | |
CN113194256B (zh) | 拍摄方法、装置、电子设备和存储介质 | |
CN102479034B (zh) | 利用图形化交互界面输入摄像机参数的方法 | |
JP6010303B2 (ja) | 画像再生装置 | |
CN108614657B (zh) | 图像合成方法、装置、设备及其图像载体 | |
CN110418056A (zh) | 一种图像处理方法、装置、存储介质及电子设备 | |
CN112584040B (zh) | 图像显示方法、装置及电子设备 | |
CN115657893A (zh) | 一种显示控制方法、显示控制装置及智能设备 | |
CN104267875A (zh) | 一种拍照模式显示方法和装置 | |
CN114710618A (zh) | 拼接图像的预览方法及装置、电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20161220 Address after: 315100 Zhejiang city of Ningbo province high tech Zone to 999 Lane Road No. 5 10 floor Applicant after: TCL mobile communication technology (Ningbo) Co., Ltd. Address before: 516006 Guangdong province Huizhou City Zhongkai high tech Zone Huifeng four Road No. 70 Applicant before: Huizhou TCL Mobile Communciation Co., Ltd. |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |