在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → 基于android柱面全景图相机应用

基于android柱面全景图相机应用

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:24.72M
  • 下载次数:16
  • 浏览次数:278
  • 发布时间:2019-04-04
  • 实例类别:Android平台开发
  • 发 布 人:yu12mang
  • 文件格式:.7z
  • 所需积分:2
 相关标签: Android 全景 相机

实例介绍

【实例简介】testlive555

【实例截图】

from clipboard


from clipboard

from clipboard



【核心代码】

package qsl.learn;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;

import android.R.integer;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.TextView;

/**
 * 全景图拍摄主页面,目前支持两张图片和三张图片的拍摄和合成
 * 
 * @author Qin Shulei
 * */
public class MypanoramaActivity extends Activity implements
		SensorEventListener, android.view.View.OnClickListener {
	/** Called when the activity is first created. */

	private CameraPreview mCameraPreview;
	private ImageView mImageView;
	private TextView mXTextView, mYTextView, mZTextView;
	private Camera mCamera;
	private ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();
	private double x = 0;
	private double y = 0;
	private double z = 0;
	private double zLast = 0;
	private SensorManager mSensorManager;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setFullScreen();
		setContentView(R.layout.mypanorama);
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

		WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
		Display display = wm.getDefaultDisplay();
		int mScreenHeight = display.getHeight();
		int mScreenWidth = display.getWidth();
		getCameraInstance();
		mCameraPreview = new CameraPreview(this, mCamera, mScreenWidth,
				(int) (mScreenHeight * 0.8));

		LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.FILL_PARENT);

		FrameLayout frameLayout = (FrameLayout) findViewById(R.id.sview);
		frameLayout.addView(mCameraPreview, params);
		mImageView = new ImageView(this);
		mImageView.bringToFront();
		mImageView.setScaleType(ScaleType.FIT_START);

		frameLayout.addView(mImageView, params);
		mImageView.setVisibility(View.GONE);

		mXTextView = (TextView) findViewById(R.id.x_textview);
		mYTextView = (TextView) findViewById(R.id.y_textview);
		mZTextView = (TextView) findViewById(R.id.z_textview);

		findViewById(R.id.combine_button).setOnClickListener(this);
		mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
	}

	public Camera getCameraInstance() {
		if (mCamera == null) {
			mCamera = Camera.open();
		}
		return mCamera;

	}

	@Override
	protected void onResume() {

		super.onResume();

		// getCameraInstance();
		if (mCameraPreview.isPreview) {
			mCamera.startPreview();
		}
		mSensorManager.registerListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
				SensorManager.SENSOR_DELAY_GAME);
	}

	@Override
	protected void onPause() {

		mSensorManager.unregisterListener(this);
		if (mCameraPreview.isPreview) {
			mCamera.stopPreview();
			mCameraPreview.isPreview = false;
			// mCameraPreview.isPreview = false;

		}
		mSensorManager.unregisterListener(this);
		// if (mCamera != null) {
		//
		// releaseCamera();
		// }

		super.onPause();

	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub

		if (mCamera != null) {

			releaseCamera();
		}
		super.onDestroy();
	}

	@Override
	protected void onStop() {

		super.onStop();

	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {

		switch (keyCode) {
		case KeyEvent.KEYCODE_CAMERA:
			if (!canTakePhotoCheck()) {
				return true;
			}
			if (mCamera != null && event.getRepeatCount() == 0) {
				zLast = z;
				mCamera.takePicture(null, null, myjpegCallback);
				return true;
			}
			break;

		default:
			break;
		}
		return super.onKeyDown(keyCode, event);
	}

	private boolean canTakePhotoCheck() {
		if (bitmaps.size() == 0 && checkHorital()) {
			return true;
		}

		if (checkHorital() && checkZChange()) {
			return true;
		}

		return false;
	}

	private boolean checkZChange() {
		if (bitmaps.size() == 0) {
			return true;
		}
		double zChange = Math.abs(z - zLast);
		if ((zChange > 19 || zChange < 21)) {
			return true;
		}
		return false;
	}

	private boolean checkHorital() {
		if ((-2 < y && y < 2) || (y < -178 || y > 178) && z > 86) {
			return true;
		}
		return false;
	}

	private PictureCallback myjpegCallback = new PictureCallback() {

		private Bitmap bm;

		// private void savePicture(String name) {
		//
		// String pathString = (name == "" ? photoname   (int) z : name)
		//   ".jpg";
		// File dirFile = new File(Const.PIC_PATH);
		// if (!dirFile.exists()) {
		//
		// dirFile.mkdirs();
		//
		// }
		// File file = new File(Const.PIC_PATH, pathString);
		// BufferedOutputStream bos = null;
		// try {
		// bos = new BufferedOutputStream(new FileOutputStream(file));
		//
		// bm.compress(CompressFormat.JPEG, 100, bos);
		// bos.flush();
		// bos.close();
		// PhotoDbAdapter photoDbAdapter = new PhotoDbAdapter(
		// MypanoramaActivity.this);
		// photoDbAdapter.open();
		// photoDbAdapter.createPhoto(file.getName(), file.getPath());
		// photoDbAdapter.close();
		// } catch (Exception e) {
		//
		// } finally {
		// bos = null;
		// }
		//
		// bitmaps.add(PhotoUtil.decodeBitmap(file.getPath(), 300));
		//
		// MypanoramaActivity.this.mCamera.startPreview();
		// mCameraPreview.isPreview = true;
		//
		// }

		@Override
		public void onPictureTaken(byte[] data, Camera camera) {
			// take photo and stop preview ,save it
			// Bitmap tempBitmap = mCameraPreview.getDrawingCache();
			camera.stopPreview();
			mCameraPreview.isPreview = false;

			bm = getScalePictureFromData(data, 300);
			bitmaps.add(bm);
			// savePicture();

			Bitmap dispayBitmap = Bitmap
					.createBitmap(bm, bm.getWidth() * 2 / 3, 0,
							bm.getWidth() / 3, bm.getHeight());
			mImageView.setImageBitmap(dispayBitmap);
			mImageView.setAlpha(150);
			mImageView.setVisibility(View.VISIBLE);
			// bm.recycle();

			camera.startPreview();
			mCameraPreview.isPreview = true;

		}

		private Bitmap getScalePictureFromData(byte[] data, int compareSize) {
			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inJustDecodeBounds = true;
			// 通过这个bitmap获取图片的宽和高
			Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
					options);
			if (bitmap == null) {
				System.out.println("bitmap为空");
			}
			float realWidth = options.outWidth;
			float realHeight = options.outHeight;
			System.out.println("真实图片高度:"   realHeight   "宽度:"   realWidth);
			// 计算缩放比
			int scale = (int) ((realHeight > realWidth ? realHeight : realWidth) / compareSize);
			if (scale <= 0) {
				scale = 1;
			}
			options.inSampleSize = scale;
			options.inJustDecodeBounds = false;
			// 注意这次要把options.inJustDecodeBounds 设为 false,这次图片是要读取出来的。
			bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
					options);
			return bitmap;

		}

	};

	private void setFullScreen() {
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
		// TODO Auto-generated method stub

	}

	private void releaseCamera() {
		if (mCamera != null) {
			mCamera.release();
		}
	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		int sensorType = event.sensor.getType();
		float[] values = event.values;
		StringBuilder sBuilder = null;
		switch (sensorType) {
		case Sensor.TYPE_ORIENTATION:

			mXTextView.setText("X:"   values[0]);
			x = values[0];
			if (checkZChange()) {
				mXTextView.setTextColor(Color.GREEN);
			} else {
				mXTextView.setTextColor(Color.RED);
			}

			mYTextView.setText("Y:"   values[1]);
			y = values[1];

			mZTextView.setText("Z:"   values[2]);
			z = values[2];
			if (checkHorital()) {
				mYTextView.setTextColor(Color.GREEN);
				mZTextView.setTextColor(Color.GREEN);
			} else {
				mYTextView.setTextColor(Color.RED);
				mZTextView.setTextColor(Color.GREEN);
			}
			break;

		default:
			break;
		}

	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.combine_button:
			combiePicture();
			break;

		default:
			break;
		}

	}

	private void combiePicture() {
		if (bitmaps.size() < 1) {
			return;
		}

		mCamera.stopPreview();
		mCameraPreview.isPreview = false;
		mSensorManager.unregisterListener(this);

		switch (bitmaps.size()) {
		case 1:
			new CombineTask().execute(bitmaps.get(0));
			break;
		case 2:
			new CombineTask().execute(bitmaps.get(0), bitmaps.get(1));
			break;

//		case 3:
//			new CombineTask().execute(bitmaps.get(0), bitmaps.get(1),
//					bitmaps.get(2));
//			break;
//		case 4:
//			new CombineTask().execute(bitmaps.get(0), bitmaps.get(1),
//					bitmaps.get(2), bitmaps.get(3));
//			break;
//		case 5:
//			new CombineTask().execute(bitmaps.get(0), bitmaps.get(1),
//					bitmaps.get(2), bitmaps.get(3), bitmaps.get(4));
//			break;
//		case 6:
//			new CombineTask().execute(bitmaps.get(0), bitmaps.get(1),
//					bitmaps.get(2), bitmaps.get(3), bitmaps.get(4),
//					bitmaps.get(5));
		default:
			Bitmap[] b = new Bitmap[bitmaps.size()];

			new CombineTask().execute(bitmaps.toArray(b));
			break;
		}

	}

	private class CombineTask extends AsyncTask<Bitmap, Void, Bitmap> {
		ProgressDialog mProgressDialog;
		private String photoname = "bitmap";
		private EditText photonameEditText;
		private Bitmap resultBitmap;

		@Override
		protected Bitmap doInBackground(Bitmap... params) {
			Bitmap newBitmap = null;
			switch (params.length) {
			case 1:
				newBitmap = combineForOne(params[0]);

				break;
			case 2:
				Bitmap result1 = params[0];
				Bitmap result2 = params[1];
				newBitmap = combineForTwo(result1, result2);
				break;
//			case 3:
//				newBitmap = combineForThree(params);
//				break;
//
//			case 4:
//				newBitmap = combineForFour(params);
//				break;
//			case 5:
//				newBitmap = combineForFive(params);
			default:
				newBitmap = combineForAnyBitmap(params);
				break;
			}

			return newBitmap;
		}

		private Bitmap combineForAnyBitmap(Bitmap[] params) {
			long start = System.currentTimeMillis();

			int width = params[0].getWidth();
			int height = params[0].getHeight();
			ArrayList<CombineBitmap> combineBitmaps = new ArrayList<CombineBitmap>();
			for (int i = 0; i < params.length; i  ) {
				combineBitmaps.add(new CombineBitmap(
						CylinderFromRectangle(params[i])));
			}
			ArrayList<Offset> offsets = new ArrayList<MypanoramaActivity.CombineTask.Offset>();
			for (int i = 1; i < params.length; i  ) {
				offsets.add(calculateOffset(combineBitmaps.get(i - 1).pixels,
						combineBitmaps.get(i).pixels, width, height));
			}		
			int CoverWidth = width / 3;
			// int secondCoverWidth = width / 3;
			Log.d("offset", "计算完毕");
			combineBitmaps.get(0).setOtherAttr(0, 0, 0,
					CoverWidth - offsets.get(0).offsetX);
			for (int i = 1; i < params.length; i  ) {
				combineBitmaps.get(i).setOtherAttr(
						combineBitmaps.get(i - 1).offsetX   2 * width / 3
								  offsets.get(i - 1).offsetX,
						combineBitmaps.get(i - 1).offsetY
								  offsets.get(i - 1).offsetY,
						combineBitmaps.get(i - 1).rightCoverWith,
						CoverWidth - offsets.get(i - 1).offsetX);
			}

			
			Log.d("combineBitmap", "创建完毕");
			int resultWidth = combineBitmaps.get(combineBitmaps.size() - 1).offsetX
					  width;
			Log.d("resultWidth", Integer.toString(resultWidth));
			int[] resultPixels = new int[resultWidth * height];
			Log.d("resultPixels", "分配成功");
			int pixColor = 0;
			int layColor = 0;

			int pixR = 0;
			int pixG = 0;
			int pixB = 0;
			int pixA = 0;

			int layR = 0;
			int layG = 0;
			int layB = 0;
			int layA = 0;

			int newR = 0;
			int newG = 0;
			int newB = 0;
			int newA = 0;

			int checkIdx = 0;
			int targertIdx = 0;

			double ratio = 0;
			int Max = height * width;
			int resultMax = resultWidth * height;

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < width - combineBitmaps.get(0).leftCoverWith; w  ) {

					resultPixels[h * resultWidth   w] = combineBitmaps.get(0).pixels[h
							* width   w];
				}
			}
			for (int h = 0; h < height; h  ) {
				for (int w = width - combineBitmaps.get(0).leftCoverWith; w < width; w  ) {
					resultPixels[h * resultWidth   w] = combineBitmaps.get(0).pixels[h
							* width   w];
				}
			}

			Log.d("firstPix", "pass");
		
			for (int i = 1; i < combineBitmaps.size(); i  ) {
				for (int h = 0; h < height; h  ) {

					for (int w = 0; w < combineBitmaps.get(i).leftCoverWith; w  ) {
						targertIdx = (h   combineBitmaps.get(i).offsetY)
								* resultWidth   w
								  combineBitmaps.get(i).offsetX;
						if (targertIdx < 0 || targertIdx > resultMax) {
							continue;
						}
						checkIdx = h * width   w;
						ratio = (double) w
								/ combineBitmaps.get(i).leftCoverWith;
						// 得到这个点在重叠部分的比例基数,以便实现渐变

						layColor = resultPixels[targertIdx];
						layR = Color.red(layColor);
						layG = Color.green(layColor);
						layB = Color.blue(layColor);
						layA = Color.alpha(layColor);

						pixColor = combineBitmaps.get(i).pixels[checkIdx];
						pixR = Color.red(pixColor);
						pixG = Color.green(pixColor);
						pixB = Color.blue(pixColor);
						pixA = Color.alpha(pixColor);
						// layA = Color.alpha(pixColor);

						if (pixA == 0) {
							newR = layR;
							newG = layG;
							newB = layB;
						} else if (layA == 0) {
							newR = pixR;
							newG = pixG;
							newB = pixB;
						} else {

							newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
									* layR * (layA / 255));
							newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
									* layG * (layA / 255));
							newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
									* layB * (layA / 255));
						}
						// newA = pixA;
						newR = Math.min(255, Math.max(newR, layR));
						newG = Math.min(255, Math.max(newG, layG));
						newB = Math.min(255, Math.max(newB, layB));
						

						resultPixels[targertIdx] = Color.rgb(newR, newG, newB);
					}

				}

				for (int h = 0; h < height; h  ) {
					for (int w = combineBitmaps.get(i).leftCoverWith; w < width; w  ) {
						targertIdx = (h   combineBitmaps.get(i).offsetY)
								* resultWidth   w
								  combineBitmaps.get(i).offsetX;
						if (targertIdx < 0 || targertIdx > resultMax) {
							continue;
						}
						resultPixels[targertIdx] = combineBitmaps.get(i).pixels[width
								* h   w];
					}

				}
				Log.d("pic", "pass");
				// combineBitmaps = null;
				// secondPixels = null;

			}

			
			bitmaps.clear();
			for (int i = 0; i < params.length; i  ) {
				params[i].recycle();
			}
			bitmaps.clear();

			Bitmap bitmap = Bitmap.createBitmap(resultWidth, height,
					Bitmap.Config.RGB_565);
			bitmap.setPixels(resultPixels, 0, resultWidth, 0, 0, resultWidth,
					height);

			long end = System.currentTimeMillis();
			Log.d("Four_pic_costTime:", Long.toString(end - start));
			return bitmap;
		}

		private Bitmap combineForFive(Bitmap[] params) {
			long start = System.currentTimeMillis();

			int width = params[0].getWidth();
			int height = params[0].getHeight();
			int[] firstPixels = CylinderFromRectangle(params[0]);
			int[] secondPixels = CylinderFromRectangle(params[1]);
			int[] thirdPixels = CylinderFromRectangle(params[2]);
			int[] fourPixels = CylinderFromRectangle(params[3]);
			int[] fivePixels = CylinderFromRectangle(params[4]);
			final Offset firstOffset = calculateOffset(firstPixels,
					secondPixels, width, height);
			final Offset secondOffset = calculateOffset(secondPixels,
					thirdPixels, width, height);
			final Offset thirdOffset = calculateOffset(thirdPixels, fourPixels,
					width, height);
			final Offset fourOffset = calculateOffset(fourPixels, fivePixels,
					width, height);
			int CoverWidth = width / 3;
			// int secondCoverWidth = width / 3;
			Log.d("offset", "计算完毕");
			CombineBitmap combineBitmap1 = new CombineBitmap(firstPixels, 0, 0,
					0, CoverWidth - firstOffset.offsetX);

			CombineBitmap combineBitmap2 = new CombineBitmap(secondPixels, 2
					* width / 3   firstOffset.offsetX, firstOffset.offsetY,
					CoverWidth - firstOffset.offsetX, CoverWidth
							- secondOffset.offsetX);
			CombineBitmap combineBitmap3 = new CombineBitmap(thirdPixels,
					combineBitmap2.offsetX   2 * width / 3
							  secondOffset.offsetX, combineBitmap2.offsetY
							  secondOffset.offsetY,
					combineBitmap2.rightCoverWith, CoverWidth
							- thirdOffset.offsetX);
			CombineBitmap combineBitmap4 = new CombineBitmap(fourPixels,
					combineBitmap3.offsetX   2 * width / 3
							  thirdOffset.offsetX, combineBitmap3.offsetY
							  thirdOffset.offsetY,
					combineBitmap3.rightCoverWith, CoverWidth
							- thirdOffset.offsetX);
			CombineBitmap combineBitmap5 = new CombineBitmap(
					fivePixels,
					combineBitmap4.offsetX   2 * width / 3   fourOffset.offsetX,
					combineBitmap4.offsetY   fourOffset.offsetY,
					combineBitmap4.rightCoverWith, CoverWidth
							- fourOffset.offsetX);
			Log.d("combineBitmap", "创建完毕");
			int resultWidth = combineBitmap5.offsetX   width;
			Log.d("resultWidth", Integer.toString(resultWidth));
			int[] resultPixels = new int[resultWidth * height];
			Log.d("resultPixels", "分配成功");
			int pixColor = 0;
			int layColor = 0;

			int pixR = 0;
			int pixG = 0;
			int pixB = 0;
			int pixA = 0;

			int layR = 0;
			int layG = 0;
			int layB = 0;
			int layA = 0;

			int newR = 0;
			int newG = 0;
			int newB = 0;
			int newA = 0;

			int checkIdx = 0;
			int targertIdx = 0;

			double ratio = 0;
			int Max = height * width;
			int resultMax = resultWidth * height;

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < width - combineBitmap1.leftCoverWith; w  ) {

					resultPixels[h * resultWidth   w] = combineBitmap1.pixels[h
							* width   w];
				}
			}
			for (int h = 0; h < height; h  ) {
				for (int w = width - combineBitmap1.leftCoverWith; w < width; w  ) {
					resultPixels[h * resultWidth   w] = combineBitmap1.pixels[h
							* width   w];
				}
			}

			Log.d("firstPix", "pass");
			combineBitmap1 = null;
			firstPixels = null;
			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < combineBitmap2.leftCoverWith; w  ) {
					targertIdx = (h   combineBitmap2.offsetY) * resultWidth   w
							  combineBitmap2.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					checkIdx = h * width   w;
					ratio = (double) w / combineBitmap2.leftCoverWith;
					// 得到这个点在重叠部分的比例基数,以便实现渐变

					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = combineBitmap2.pixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {

						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);
				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = combineBitmap2.leftCoverWith; w < width; w  ) {
					targertIdx = (h   combineBitmap2.offsetY) * resultWidth   w
							  combineBitmap2.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					resultPixels[targertIdx] = combineBitmap2.pixels[width * h
							  w];
				}

			}
			Log.d("secondPix", "pass");
			combineBitmap2 = null;
			secondPixels = null;
			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < combineBitmap3.leftCoverWith; w  ) {
					targertIdx = (h   combineBitmap3.offsetY) * resultWidth   w
							  combineBitmap3.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					checkIdx = h * width   w;
					ratio = (double) w / combineBitmap3.leftCoverWith;
					// 得到这个点在重叠部分的比例基数,以便实现渐变

					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = combineBitmap3.pixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {

						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);
				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = combineBitmap3.leftCoverWith; w < width; w  ) {
					targertIdx = (h   combineBitmap3.offsetY) * resultWidth   w
							  combineBitmap3.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					resultPixels[targertIdx] = combineBitmap3.pixels[width * h
							  w];
				}

			}

			Log.d("thirdPix", "pass");
			combineBitmap3 = null;
			thirdPixels = null;

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < combineBitmap4.leftCoverWith; w  ) {
					targertIdx = (h   combineBitmap4.offsetY) * resultWidth   w
							  combineBitmap4.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					checkIdx = h * width   w;
					ratio = (double) w / combineBitmap4.leftCoverWith;
					// 得到这个点在重叠部分的比例基数,以便实现渐变

					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = combineBitmap4.pixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {

						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);
				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = combineBitmap4.leftCoverWith; w < width; w  ) {
					targertIdx = (h   combineBitmap4.offsetY) * resultWidth   w
							  combineBitmap4.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					resultPixels[targertIdx] = combineBitmap4.pixels[width * h
							  w];
				}

			}
			Log.d("fourpix", "pass");
			combineBitmap4 = null;
			fourPixels = null;

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < combineBitmap5.leftCoverWith; w  ) {
					targertIdx = (h   combineBitmap5.offsetY) * resultWidth   w
							  combineBitmap5.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					checkIdx = h * width   w;
					ratio = (double) w / combineBitmap5.leftCoverWith;
					// 得到这个点在重叠部分的比例基数,以便实现渐变

					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = combineBitmap5.pixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {

						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);
				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = combineBitmap5.leftCoverWith; w < width; w  ) {
					targertIdx = (h   combineBitmap5.offsetY) * resultWidth   w
							  combineBitmap5.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					resultPixels[targertIdx] = combineBitmap5.pixels[width * h
							  w];
				}

			}
			Log.d("fourpix", "pass");
			combineBitmap5 = null;
			fourPixels = null;

			Bitmap bitmap = Bitmap.createBitmap(resultWidth, height,
					Bitmap.Config.RGB_565);
			bitmap.setPixels(resultPixels, 0, resultWidth, 0, 0, resultWidth,
					height);

			long end = System.currentTimeMillis();
			Log.d("Four_pic_costTime:", Long.toString(end - start));
			return bitmap;
		}

		private Bitmap combineForOne(Bitmap params) {

			int width = params.getWidth();
			int height = params.getHeight();
			int[] Pixels = CylinderFromRectangle(params);

			Bitmap bitmap = Bitmap.createBitmap(width, height,
					Bitmap.Config.RGB_565);
			bitmap.setPixels(Pixels, 0, width, 0, 0, width, height);
			return bitmap;
		}

		private Bitmap combineForThree(Bitmap[] params) {
			long start = System.currentTimeMillis();

			int width = params[0].getWidth();
			int height = params[0].getHeight();
			int[] firstPixels = CylinderFromRectangle(params[0]);
			int[] secondPixels = CylinderFromRectangle(params[1]);
			int[] thirdPixels = CylinderFromRectangle(params[2]);

			final Offset firstOffset = calculateOffset(firstPixels,
					secondPixels, width, height);
			final Offset secondOffset = calculateOffset(secondPixels,
					thirdPixels, width, height);
			int resultWidth = width * 3 - width * 2 / 3 - firstOffset.offsetX
					- secondOffset.offsetX;
			int[] resultPixels = new int[resultWidth * height];

			int pixColor = 0;
			int layColor = 0;

			int pixR = 0;
			int pixG = 0;
			int pixB = 0;
			int pixA = 0;

			int layR = 0;
			int layG = 0;
			int layB = 0;
			int layA = 0;

			int newR = 0;
			int newG = 0;
			int newB = 0;
			int newA = 0;

			int checkIdx = 0;
			int targertIdx = 0;
			int firstCoverWidth = width / 3;
			int secondCoverWidth = width / 3;
			double ratio = 0;
			int Max = height * width;

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < width; w  ) {
					resultPixels[h * resultWidth   w] = firstPixels[h * width
							  w];
				}
			}
			firstPixels = null;
			Log.d("firstBitmap", "the first bitmap pass!");

			firstCoverWidth = width / 3   firstOffset.offsetX;

			Log.d("firstCoverWidth", Integer.toString(firstCoverWidth));
			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < firstCoverWidth; w  ) {

					checkIdx = (h   firstOffset.offsetY) * width   w
							  firstOffset.offsetX;
					if (checkIdx < 0 || checkIdx >= Max) {
						continue;
					}

					ratio = (double) w / firstCoverWidth;
					// 得到这个点在重叠部分的比例基数,以便实现渐变
					targertIdx = h * resultWidth   w   width - firstCoverWidth;
					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = secondPixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {

						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);

				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < width - firstCoverWidth; w  ) {

					checkIdx = (h   firstOffset.offsetY) * width
							  firstCoverWidth   firstOffset.offsetX   w;
					if (checkIdx < 0 || checkIdx >= Max) {
						continue;
					}
					resultPixels[h * resultWidth   width   w] = secondPixels[checkIdx];
				}
			}
			secondPixels = null;
			Log.d("SecondBitmap", "the Second bitmap pass!");

			secondCoverWidth = width / 3   secondOffset.offsetX;

			Log.d("secondCoverWidth", Integer.toString(secondCoverWidth));
			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < secondCoverWidth; w  ) {

					checkIdx = (h   firstOffset.offsetY   secondOffset.offsetY)
							* width   w   firstOffset.offsetX
							  secondOffset.offsetX;
					if (checkIdx < 0 || checkIdx >= Max) {
						continue;
					}

					ratio = (double) w / firstCoverWidth;
					// 得到这个点在重叠部分的比例基数,以便实现渐变
					targertIdx = h * resultWidth   w   width * 2
							- secondCoverWidth - firstCoverWidth;
					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = thirdPixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);
					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {
						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}

					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);

				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < width - secondCoverWidth; w  ) {

					checkIdx = (h   firstOffset.offsetY   secondOffset.offsetY)
							* width   secondCoverWidth   w
							  firstOffset.offsetX   secondOffset.offsetX;
					if (checkIdx < 0 || checkIdx >= Max) {
						continue;
					}
					targertIdx = h * resultWidth   2 * width - firstCoverWidth
							  w;
					try {
						resultPixels[targertIdx] = thirdPixels[checkIdx];
					} catch (Exception e) {
						Log.d("", Integer.toString(targertIdx));
					}

				}
			}
			thirdPixels = null;
			Log.d("SecondBitmap", "the Second bitmap pass!");

			Bitmap bitmap = Bitmap.createBitmap(resultWidth, height,
					Bitmap.Config.RGB_565);
			bitmap.setPixels(resultPixels, 0, resultWidth, 0, 0, resultWidth,
					height);

			long end = System.currentTimeMillis();
			Log.d("Three_pic_costTime:", Long.toString(end - start));
			return bitmap;
		}

		private Offset calculateOffset(int[] firstPixels, int[] secondPixels,
				int width, int height) {

			long start = System.currentTimeMillis();
			Offset resultOffset = new Offset(0, 0);
			int pixColor = 0;
			int layColor = 0;

			int pixR = 0;
			int pixG = 0;
			int pixB = 0;
			int pixA = 0;

			int layR = 0;
			int layG = 0;
			int layB = 0;
			int layA = 0;

			long sum = 0;
			long smallSum = Long.MAX_VALUE;

			int offset = width * 2 / 3;
			int tempWidth = width / 6;

			// 15用来去除掉边缘没有色彩的部分,硬编码,有待改进
			for (int i = -tempWidth   20; i < tempWidth - 20; i  ) {
				// for (int j = -height / 6; j < height / 6; j  ) {
				// 先不做Y轴的偏移。
				for (int j = 0; j < 1; j  ) {
					sum = 0;

					for (int k = 0; k < height * 2 / 3; k  ) {

						layColor = firstPixels[(int) (height / 6   k) * width
								  offset   tempWidth];
						layR = Color.red(layColor);
						layG = Color.green(layColor);
						layB = Color.blue(layColor);

						pixColor = secondPixels[((int) (height / 6)   j   k)
								* width   tempWidth   i];
						pixR = Color.red(pixColor);
						pixG = Color.green(pixColor);
						pixB = Color.blue(pixColor);

						sum  = Math.pow(layR - pixR, 2);
						sum  = Math.pow(layG - pixG, 2);
						sum  = Math.pow(layB - pixB, 2);

					}

					if (smallSum > sum) {
						smallSum = sum;

						resultOffset.offsetX = i;
						resultOffset.offsetY = j;

					}
				}
			}

			Log.d("smallsum:", Long.toString(smallSum));
			Log.d("resultOffsetX:", Integer.toString(resultOffset.offsetX));
			Log.d("resultOffsetY:", Integer.toString(resultOffset.offsetY));
			long end = System.currentTimeMillis();
			Log.d("calculateOffset  Cost_time:", Long.toString(end - start));
			return resultOffset;
		}

		private Bitmap combineForTwo(Bitmap result1, Bitmap result2) {
			long start = System.currentTimeMillis();
			int width = result1.getWidth();
			int height = result1.getHeight();
			Bitmap bitmap = Bitmap.createBitmap(width * 5 / 3, height,
					Bitmap.Config.RGB_565);
			int ResultWidth = (width * 5 / 3);
			int[] pixelsResult = new int[ResultWidth * height];

			int pixColor = 0;
			int layColor = 0;

			int pixR = 0;
			int pixG = 0;
			int pixB = 0;
			int pixA = 0;

			int layR = 0;
			int layG = 0;
			int layB = 0;
			int layA = 0;

			int newR = 0;
			int newG = 0;
			int newB = 0;
			int newA = 0;

			double RatioBase = (double) width / 3;
			// Log.d("aRatio", Double.toString(aRatio));
			double ratio = 0;

			int offsetX = 0;
			int offsetY = 0;

			int[] pixels = CylinderFromRectangle(result1);
			Log.d("get_bitmap", "获得第一张图像");
			for (int i = 0; i < height; i  ) {
				for (int j = 0; j < width / 3; j  ) {
					pixelsResult[i * ResultWidth   j] = pixels[i * width   j];
				}

			}
			Log.d("array_bound", "第一幅第一部分通过");
			for (int i = 0; i < height; i  ) {
				for (int j = width / 3; j < width * 2 / 3; j  ) {
					pixelsResult[i * ResultWidth   j] = pixels[i * width   j];
				}

			}
			Log.d("array_bound", "第一幅第二部分通过");
			for (int i = 0; i < height; i  ) {
				for (int j = width * 2 / 3; j < width; j  ) {
					pixColor = pixels[i * width   j];
					// pixR = Color.red(pixColor);
					// pixG = Color.green(pixColor);
					// pixB = Color.blue(pixColor);
					// pixA = (int) (aRatio * (width - j));
					// pixColor = Color.argb(pixA, pixR, pixG, pixB);
					pixelsResult[i * ResultWidth   j] = pixColor;

				}

			}
			Log.d("array_bound", ";第一幅第三部分通过");
			pixels = null;
			pixels = CylinderFromRectangle(result2);
			Log.d("get_bitmap", "获得第二张图像");
			int offset = width * 2 / 3;
			int tempWidth = width / 6;
			long sum = 0;
			long smallSum = Long.MAX_VALUE;

			// 15用来去除掉边缘没有色彩的部分,硬编码,有待改进
			for (int i = -tempWidth   15; i < tempWidth - 15; i  ) {
				for (int j = -height / 6; j < height / 6; j  ) {
					sum = 0;

					// 多条线更多匹配
					// for (int k = 0; k < height * 2 / 3; k  ) {
					//
					// layColor = pixelsResult[(int) (height / 6   k)
					// * ResultWidth   offset   tempWidth - 5];
					// layR = Color.red(layColor);
					// layG = Color.green(layColor);
					// layB = Color.blue(layColor);
					// pixColor = pixels[((int) (height / 6)   j   k) * width
					//   tempWidth   i - 5];
					// pixR = Color.red(pixColor);
					// pixG = Color.green(pixColor);
					// pixB = Color.blue(pixColor);
					//
					// sum  = Math.pow(layR - pixR, 2);
					// sum  = Math.pow(layG - pixG, 2);
					// sum  = Math.pow(layB - pixB, 2);
					//
					// }
					for (int k = 0; k < height * 2 / 3; k  ) {

						layColor = pixelsResult[(int) (height / 6   k)
								* ResultWidth   offset   tempWidth];
						layR = Color.red(layColor);
						layG = Color.green(layColor);
						layB = Color.blue(layColor);

						pixColor = pixels[((int) (height / 6)   j   k) * width
								  tempWidth   i];
						pixR = Color.red(pixColor);
						pixG = Color.green(pixColor);
						pixB = Color.blue(pixColor);

						sum  = Math.pow(layR - pixR, 2);
						sum  = Math.pow(layG - pixG, 2);
						sum  = Math.pow(layB - pixB, 2);

					}
					// for (int k = 0; k < height * 2 / 3; k  ) {
					//
					// layColor = pixelsResult[(int) (height / 6   k)
					// * ResultWidth   offset   tempWidth   5];
					// layR = Color.red(layColor);
					// layG = Color.green(layColor);
					// layB = Color.blue(layColor);
					// pixColor = pixels[((int) (height / 6)   j   k) * width
					//   tempWidth   i   5];
					// pixR = Color.red(pixColor);
					// pixG = Color.green(pixColor);
					// pixB = Color.blue(pixColor);
					// sum  = Math.pow(layR - pixR, 2);
					// sum  = Math.pow(layG - pixG, 2);
					// sum  = Math.pow(layB - pixB, 2);
					// }
					if (smallSum > sum) {
						smallSum = sum;
						offsetX = i;
						offsetY = j;
						// Log.d("sum:", Long.toString(smallSum));
					}
				}
			}

			Log.d("offsetX:", Integer.toString(offsetX));
			Log.d("offsetY:", Integer.toString(offsetY));
			int checkIdx = 0;
			int Max = width * height;
			// offsetY = 0;// 先屏蔽掉Y轴偏移,,不然太坑了
			for (int i = 0; i < height; i  ) {
				for (int j = 0; j < width / 3; j  ) {
					ratio = (double) j / RatioBase;

					layColor = pixelsResult[i * ResultWidth   j   offset];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);
					checkIdx = (i   offsetY) * width   j   offsetX;
					if (checkIdx < 0 || checkIdx >= Max) {
						continue;
					}
					pixColor = pixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
							* layR * (layA / 255));
					newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
							* layG * (layA / 255));
					newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
							* layB * (layA / 255));
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					pixelsResult[i * ResultWidth   j   offset] = Color.rgb(
							newR, newG, newB);
				}

			}
			Log.d("array_bound", "第二幅第一部分通过");
			for (int i = 0; i < height; i  ) {
				for (int j = width / 3; j < width * 2 / 3; j  ) {
					checkIdx = (i   offsetY) * width   j   offsetX;
					if (checkIdx < 0 || checkIdx >= Max) {
						continue;
					}
					pixColor = pixels[checkIdx];
					pixelsResult[i * ResultWidth   j   offset] = pixColor;
				}

			}
			Log.d("array_bound", "第二幅第二部分通过");
			for (int i = 0; i < height; i  ) {
				for (int j = width * 2 / 3; j < width; j  ) {
					checkIdx = (i   offsetY) * width   j   offsetX;
					if (checkIdx < 0 || checkIdx >= Max) {
						continue;
					}
					pixColor = pixels[checkIdx];
					pixelsResult[i * ResultWidth   j   offset] = pixColor;
				}

			}
			Log.d("array_bound", "第二幅第三部分通过");
			pixels = null;

			bitmap.setPixels(pixelsResult, 0, ResultWidth, 0, 0, ResultWidth,
					height);

			long end = System.currentTimeMillis();
			Log.d("Three_pic_costTime:", Long.toString(end - start));
			return bitmap;
		}

		private Bitmap combineForFour(Bitmap[] params) {
			long start = System.currentTimeMillis();

			int width = params[0].getWidth();
			int height = params[0].getHeight();
			int[] firstPixels = CylinderFromRectangle(params[0]);
			int[] secondPixels = CylinderFromRectangle(params[1]);
			int[] thirdPixels = CylinderFromRectangle(params[2]);
			int[] fourPixels = CylinderFromRectangle(params[3]);
			final Offset firstOffset = calculateOffset(firstPixels,
					secondPixels, width, height);
			final Offset secondOffset = calculateOffset(secondPixels,
					thirdPixels, width, height);
			final Offset thirdOffset = calculateOffset(thirdPixels, fourPixels,
					width, height);
			int CoverWidth = width / 3;
			// int secondCoverWidth = width / 3;
			Log.d("offset", "计算完毕");
			CombineBitmap combineBitmap1 = new CombineBitmap(firstPixels, 0, 0,
					0, CoverWidth - firstOffset.offsetX);

			CombineBitmap combineBitmap2 = new CombineBitmap(secondPixels, 2
					* width / 3   firstOffset.offsetX, firstOffset.offsetY,
					CoverWidth - firstOffset.offsetX, CoverWidth
							- secondOffset.offsetX);
			CombineBitmap combineBitmap3 = new CombineBitmap(thirdPixels,
					combineBitmap2.offsetX   2 * width / 3
							  secondOffset.offsetX, combineBitmap2.offsetY
							  secondOffset.offsetY,
					combineBitmap2.rightCoverWith, CoverWidth
							- thirdOffset.offsetX);
			CombineBitmap combineBitmap4 = new CombineBitmap(fourPixels,
					combineBitmap3.offsetX   2 * width / 3
							  thirdOffset.offsetX, combineBitmap3.offsetY
							  thirdOffset.offsetY,
					combineBitmap3.rightCoverWith, CoverWidth
							- thirdOffset.offsetX);
			Log.d("combineBitmap", "创建完毕");
			int resultWidth = combineBitmap4.offsetX   width;
			Log.d("resultWidth", Integer.toString(resultWidth));
			int[] resultPixels = new int[resultWidth * height];
			Log.d("resultPixels", "分配成功");
			int pixColor = 0;
			int layColor = 0;

			int pixR = 0;
			int pixG = 0;
			int pixB = 0;
			int pixA = 0;

			int layR = 0;
			int layG = 0;
			int layB = 0;
			int layA = 0;

			int newR = 0;
			int newG = 0;
			int newB = 0;
			int newA = 0;

			int checkIdx = 0;
			int targertIdx = 0;

			double ratio = 0;
			int Max = height * width;
			int resultMax = resultWidth * height;

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < width - combineBitmap1.leftCoverWith; w  ) {

					resultPixels[h * resultWidth   w] = combineBitmap1.pixels[h
							* width   w];
				}
			}
			for (int h = 0; h < height; h  ) {
				for (int w = width - combineBitmap1.leftCoverWith; w < width; w  ) {
					resultPixels[h * resultWidth   w] = combineBitmap1.pixels[h
							* width   w];
				}
			}

			Log.d("firstPix", "pass");
			combineBitmap1 = null;
			firstPixels = null;
			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < combineBitmap2.leftCoverWith; w  ) {
					targertIdx = (h   combineBitmap2.offsetY) * resultWidth   w
							  combineBitmap2.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					checkIdx = h * width   w;
					ratio = (double) w / combineBitmap2.leftCoverWith;
					// 得到这个点在重叠部分的比例基数,以便实现渐变

					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = combineBitmap2.pixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {

						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);
				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = combineBitmap2.leftCoverWith; w < width; w  ) {
					targertIdx = (h   combineBitmap2.offsetY) * resultWidth   w
							  combineBitmap2.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					resultPixels[targertIdx] = combineBitmap2.pixels[width * h
							  w];
				}

			}
			Log.d("secondPix", "pass");
			combineBitmap2 = null;
			secondPixels = null;
			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < combineBitmap3.leftCoverWith; w  ) {
					targertIdx = (h   combineBitmap3.offsetY) * resultWidth   w
							  combineBitmap3.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					checkIdx = h * width   w;
					ratio = (double) w / combineBitmap3.leftCoverWith;
					// 得到这个点在重叠部分的比例基数,以便实现渐变

					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = combineBitmap3.pixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {

						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);
				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = combineBitmap3.leftCoverWith; w < width; w  ) {
					targertIdx = (h   combineBitmap3.offsetY) * resultWidth   w
							  combineBitmap3.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					resultPixels[targertIdx] = combineBitmap3.pixels[width * h
							  w];
				}

			}

			Log.d("thirdPix", "pass");
			combineBitmap3 = null;
			thirdPixels = null;

			for (int h = 0; h < height; h  ) {
				for (int w = 0; w < combineBitmap4.leftCoverWith; w  ) {
					targertIdx = (h   combineBitmap4.offsetY) * resultWidth   w
							  combineBitmap4.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					checkIdx = h * width   w;
					ratio = (double) w / combineBitmap4.leftCoverWith;
					// 得到这个点在重叠部分的比例基数,以便实现渐变

					layColor = resultPixels[targertIdx];
					layR = Color.red(layColor);
					layG = Color.green(layColor);
					layB = Color.blue(layColor);
					layA = Color.alpha(layColor);

					pixColor = combineBitmap4.pixels[checkIdx];
					pixR = Color.red(pixColor);
					pixG = Color.green(pixColor);
					pixB = Color.blue(pixColor);
					pixA = Color.alpha(pixColor);
					// layA = Color.alpha(pixColor);

					if (pixA == 0) {
						newR = layR;
						newG = layG;
						newB = layB;
					} else if (layA == 0) {
						newR = pixR;
						newG = pixG;
						newB = pixB;
					} else {

						newR = (int) (ratio * pixR * (pixA / 255)   (1 - ratio)
								* layR * (layA / 255));
						newG = (int) (ratio * pixG * (pixA / 255)   (1 - ratio)
								* layG * (layA / 255));
						newB = (int) (ratio * pixB * (pixA / 255)   (1 - ratio)
								* layB * (layA / 255));
					}
					// newA = pixA;
					newR = Math.min(255, Math.max(newR, 0));
					newG = Math.min(255, Math.max(newG, 0));
					newB = Math.min(255, Math.max(newB, 0));

					resultPixels[targertIdx] = Color.rgb(newR, newG, newB);
				}

			}

			for (int h = 0; h < height; h  ) {
				for (int w = combineBitmap4.leftCoverWith; w < width; w  ) {
					targertIdx = (h   combineBitmap4.offsetY) * resultWidth   w
							  combineBitmap4.offsetX;
					if (targertIdx < 0 || targertIdx > resultMax) {
						continue;
					}
					resultPixels[targertIdx] = combineBitmap4.pixels[width * h
							  w];
				}

			}
			Log.d("fourpix", "pass");
			combineBitmap4 = null;
			fourPixels = null;

			Bitmap bitmap = Bitmap.createBitmap(resultWidth, height,
					Bitmap.Config.RGB_565);
			bitmap.setPixels(resultPixels, 0, resultWidth, 0, 0, resultWidth,
					height);

			long end = System.currentTimeMillis();
			Log.d("Four_pic_costTime:", Long.toString(end - start));
			return bitmap;
		}

		private class Offset {
			int offsetX;
			int offsetY;

			public Offset(int x, int y) {
				offsetX = x;
				offsetY = y;
			}
		};

		@Override
		protected void onPreExecute() {
			mProgressDialog = ProgressDialog.show(MypanoramaActivity.this,
					"正在处理图像", "请耐心等待", true, false);
		}

		@Override
		protected void onPostExecute(Bitmap result) {
			mProgressDialog.dismiss();

			for (Bitmap bitmap : bitmaps) {
				bitmap.recycle();
			}
			bitmaps.clear();
			resultBitmap = result;
			createDialog();

		}

		private void createDialog() {
			// TODO Auto-generated method stub\
			View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
			photonameEditText = (EditText) saveDialog
					.findViewById(R.id.phone_name);
			ImageView imageView = (ImageView) saveDialog
					.findViewById(R.id.show);
			imageView.setImageBitmap(resultBitmap);
			new AlertDialog.Builder(MypanoramaActivity.this)
					.setView(saveDialog)
					.setPositiveButton(getString(R.string.text_save),
							saveClickListener)
					.setNegativeButton(getString(R.string.text_cancel),
							cancelClickListener).show();
		}

		private OnClickListener cancelClickListener = new OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				long rowId = savePicture("", resultBitmap);
				// Intent intent = new Intent(MypanoramaActivity.this,
				// EffectPhotoActivity.class);
				// intent.putExtra(PhotoDbAdapter.KEY_ROWID, rowId);
				// startActivity(intent);
				MypanoramaActivity.this.finish();
			}

		};
		private OnClickListener saveClickListener = new OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				String string = photonameEditText.getText().toString();
				long rowId = savePicture(string, resultBitmap);
				Intent intent = new Intent(MypanoramaActivity.this,
						EffectPhotoActivity.class);
				intent.putExtra(PhotoDbAdapter.KEY_ROWID, rowId);
				Log.d("rowId", Long.toString(rowId));
				startActivity(intent);
				MypanoramaActivity.this.finish();
			}
		};
	}

	private long savePicture(String name, Bitmap bm) {

		String pathString = (name == "" ? Const.PHOTO_NAME_STRING   (int) z
				: name)   ".jpg";
		File dirFile = new File(Const.PIC_PATH);
		long RowId = 0;
		if (!dirFile.exists()) {

			dirFile.mkdirs();

		}
		File file = new File(Const.PIC_PATH, pathString);
		BufferedOutputStream bos = null;
		try {
			bos = new BufferedOutputStream(new FileOutputStream(file));

			bm.compress(CompressFormat.JPEG, 100, bos);
			bos.flush();
			bos.close();
			PhotoDbAdapter photoDbAdapter = new PhotoDbAdapter(
					MypanoramaActivity.this);
			photoDbAdapter.open();
			RowId = photoDbAdapter.createPhoto(file.getName(), file.getPath());
			photoDbAdapter.close();
		} catch (Exception e) {

		} finally {
			bos = null;
		}
		return RowId;
	}

	private int[] CylinderFromRectangle(Bitmap taskBitmap) {
		long start = System.currentTimeMillis();
		int width = taskBitmap.getWidth();
		int height = taskBitmap.getHeight();
		Bitmap bitmap = Bitmap.createBitmap(width, height,
				Bitmap.Config.RGB_565);
		double r = (double) width / Math.tan(Math.toRadians(30));
		Log.d("半径:", "半径:"   r);
		double a;
		int x;
		int y;
		int pixcolor = 0;
		int idx;
		int idx2;
		int[] pixels = new int[width * height];
		// int lucency = Color.argb(0, 0, 0, 0);
		// Log.d("lucency:", Integer.toString(lucency));
		int[] pixelsResult = new int[width * height];
		// for (int i = 0; i < pixelsResult.length; i  ) {
		// pixelsResult[i] = lucency;
		// }
		taskBitmap.getPixels(pixels, 0, width, 0, 0, width, height);

		for (int i = -width / 2; i < width / 2; i  ) {
			a = Math.atan(i / r);
			x = (int) (a * r);
			for (int j = height / 2; j > -height / 2; j--) {
				y = (int) (j * Math.cos(a));
				idx = (i   width / 2)   (height / 2 - j) * width;
				idx = Math.min(width * height - 1, Math.max(0, idx));
				pixcolor = pixels[idx];
				idx2 = x   width / 2   (height / 2 - y) * width;
				idx2 = Math.min(width * height - 1, Math.max(0, idx2));
				pixelsResult[idx2] = pixcolor;
			}
		}
		pixels = null;
		// bitmap.setPixels(pixelsResult, 0, width, 0, 0, width, height);
		long end = System.currentTimeMillis();
		Log.d("effect_cost_time", "costTime:"   (end - start));
		return pixelsResult;
	}

}

标签: Android 全景 相机

实例下载地址

基于android柱面全景图相机应用

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警