实例介绍
【实例简介】testlive555
【实例截图】
【核心代码】
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; } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论