你好我在使用
Android Camera API编码相机应用程序!
它具有以下功能:
>该应用程序具有相机预览的图像视图
>用户可以在相机预览上拖放该图像视图
> drop事件捕获图像视图放置的位置
>用户捕获图像,图像视图正在用户想要的拖动然后放置位置添加到照片上
以下是用于图像视图拖放的代码:
@Override public boolean onTouch(View view,MotionEvent event) { final int X = (int) event.getRawX(); final int Y = (int) event.getRawY(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); _xDelta = X - lParams.leftMargin; _yDelta = Y - lParams.topMargin; break; case MotionEvent.ACTION_UP: xloc=X; yloc=Y; Toast.makeText(getContext(),"Location==="+Integer.toString(xloc)+"==="+Integer.toString(yloc),Toast.LENGTH_SHORT).show(); break; case MotionEvent.ACTION_POINTER_DOWN: break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_MOVE: RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view .getLayoutParams(); layoutParams.leftMargin = X - _xDelta; layoutParams.topMargin = Y - _yDelta; layoutParams.rightMargin = -250; layoutParams.bottomMargin = -250; view.setLayoutParams(layoutParams); break; } mRrootLayout.invalidate(); return true; }
xloc和yloc包含用户将放弃该图像视图的位置!
这是我用来确定设备方向的代码.由于传感器正在完成,因为默认情况下,在manifest.xml中将活动设置为纵向
@Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; float y = event.values[1]; if (x < 5 && x > -5 && y > 5){ //portrait UP ↑↑↑ cam_orientation = 0; image_watermark.setRotation(0); //rotating the water mark with screen orientation } else if (x<-5 && y<5 && y>-5) { //landscape RIGHT →→→ cam_orientation = 3; image_watermark.setRotation(270); } else if (x<5 && x>-5 && y<-5) { //Portrait DOWN ↓↓↓ cam_orientation = 4; image_watermark.setRotation(0); } else if (x>5 && y<5 && y>-5){ //Landscape LEFT ←←← cam_orientation = 1; image_watermark.setRotation(90); } }
这是用于捕获图像的代码
private Camera.PictureCallback mPicture = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data,Camera camera) { File pictureFile = getOutputMediaFile(1); if (pictureFile == null){ Log.i("#LOGTAG pic","Exception"); return; } try { //rotate the image view as expected BitmapFactory.Options options = new BitmapFactory.Options(); Bitmap mBitmap = BitmapFactory.decodeByteArray(data,data.length,options); if(cam_orientation==0){ //portrait UP ↑↑↑ if(cam_id==1){ //this is front camera id=1 mBitmap= rotate(mBitmap,270); mBitmap=flip(mBitmap); } if(cam_id==0){ mBitmap= rotate(mBitmap,90); } } if(cam_orientation==1){ //Landscape LEFT ←←← if(cam_id==1){ //this is front camera id=1 mBitmap= rotate(mBitmap,0); mBitmap=flip(mBitmap); } if(cam_id==0){ //this is back camera id=0 mBitmap= rotate(mBitmap,0); } } if(cam_orientation==3){ //landscape RIGHT →→→ if(cam_id==1){ //this is front camera id=1 mBitmap= rotate(mBitmap,180); mBitmap=flip(mBitmap); } if(cam_id==0){ //this is back camera id=0 mBitmap= rotate(mBitmap,180); } } if(cam_orientation==4){ //Portrait DOWN ↓↓↓ if(cam_id==1){ //this is front camera id=1 mBitmap= rotate(mBitmap,90); mBitmap=flip(mBitmap); } if(cam_id==0){ //this is back camera id=0 mBitmap= rotate(mBitmap,270); } } //add the water mark to the camera photo bitmap here Bitmap mutableBitmap = mBitmap.copy(Bitmap.Config.ARGB_8888,true); image_watermark.buildDrawingCache(); Bitmap bmap = image_watermark.getDrawingCache(); Bitmap final_image=Bitmap.createScaledBitmap(bmap,(image_watermark.getMeasuredWidth())*2,false); Canvas canvas = new Canvas(mutableBitmap); if(cam_id==1){ canvas.drawBitmap(icon,(int)(xloc*1.5),(int)(yloc*1.5),null); //setting the location of the water mark image view on front camera/photo } if(cam_id==0){ canvas.drawBitmap(icon,xloc*2,yloc*2,null); //setting the location of the water mark image view on back camera/photo } FileOutputStream fos = new FileOutputStream(pictureFile); mutableBitmap.compress(Bitmap.CompressFormat.JPEG,100,fos); fos.close(); }
我有一个问题,从相机拍摄的照片设置水印图像视图的位置!我只想设置水印图像视图的位置,以便用户拖放该水印图像视图.
虽然代码工作正常,但是在为不同设备拍摄的照片上设置水印图像视图位置时,缺乏准确性和准确性.
我一直在尝试不同的设备,但每个设备扭曲了准确的位置.
有人可以给我任何想法或更好的方法在相机拍摄的照片上添加水印图像!
请注意,相机的ID为:
cam_id=1 for the from camera cam_id=0 for the back camera
我需要一种方法,以便我可以将所有设备定位模式和至少一些多个设备的水印图像放置.
假设当屏幕处于纵向位置时,如果我在这个蓝色按钮上拖动我的图像视图,则图像应保存在蓝色按钮上相同位置的相机拍摄的照片上!
同样的,如果我把它放在那个盒子上,照相机拍摄的照片应该将这个图像视图在横向模式下放在那个盒子上.
下面是使用的XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=""> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@color/colorAccent"> <ToggleButton android:id="@+id/flipper" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:background="@drawable/my_btn_toggle" android:textOff="" android:textOn=""/> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="10" android:id="@+id/root"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/camera_preview"> </FrameLayout> <ImageView android:layout_width="0dp" android:layout_height="0dp" android:id="@+id/watermark" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#000" android:layout_alignParentBottom="true" android:gravity="center" android:id="@+id/capture_layout"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/capture" android:text="Capture" android:layout_alignParentBottom="true" android:layout_alignParentRight="true"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/neg" android:text="Cancel Para" android:layout_alignParentBottom="true" android:layout_alignParentRight="true"/> </LinearLayout> </LinearLayout> </RelativeLayout>
解决方法
您可以将查看包含相机视图和水印转换为位图,并将其保存到手机内存,而不会直接从相机捕获图像.它将像截图一样工作.并且您的水印将被放置在出现的相同位置.
确保Camera View和水印Image-View都位于同一父视图中,并将其父视图转换为位图.
这个Link可以帮助你.