package com.eighteengray.procamera.activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.FrameLayout; import android.widget.Gallery; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import com.eighteengray.commonutillibrary.ImageUtils; import com.eighteengray.commonutillibrary.ScreenUtils; import com.eighteengray.imageprocesslibrary.bitmapfilter.ColorBitmapFilter; import com.eighteengray.imageprocesslibrary.bitmapfilter.IBitmapFilter; import com.eighteengray.procamera.R; import com.eighteengray.procamera.adapter.BitmapFilterAdapter; import com.eighteengray.procamera.adapter.MarkAdapter; import com.eighteengray.procamera.bean.FilterInfo; import com.eighteengray.procamera.bean.MarkInfo; import com.eighteengray.procamera.bean.SaveImage; import com.eighteengray.procamera.widget.MyTouchImageView; import com.eighteengray.procamera.widget.ProcessImageView; import com.eighteengray.procamera.widget.dialogfragment.PopupWindowFactory; import com.eighteengray.procameralibrary.common.Constants; import com.eighteengray.procameralibrary.dataevent.BitmapProcess; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.io.File; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class ImageProcessActivity extends BaseActivity { //上部 @BindView(R.id.rl_topmenu_gallery) RelativeLayout rl_topmenu_gallery; @BindView(R.id.iv_finish_gallery) ImageView iv_finish_gallery; @BindView(R.id.button_next_gallery) Button button_next_gallery; //下部 @BindView(R.id.ll_bottommenu_film) LinearLayout ll_bottommenu_film; @BindView(R.id.rl_cut_film) RelativeLayout rl_cut_film; @BindView(R.id.iv_cut_film) ImageView iv_cut_film; @BindView(R.id.tv_cut_film) TextView tv_cut_film; @BindView(R.id.rl_filter_film) RelativeLayout rl_filter_film; @BindView(R.id.iv_filter_film) ImageView iv_filter_film; @BindView(R.id.tv_filter_film) TextView tv_filter_film; @BindView(R.id.rl_subtitle_film) RelativeLayout rl_subtitle_film; @BindView(R.id.iv_subtitle_film) ImageView iv_subtitle_film; @BindView(R.id.tv_subtitle_film) TextView tv_subtitle_film; @BindView(R.id.rl_yinji_film) RelativeLayout rl_yinji_film; @BindView(R.id.iv_yinji_film) ImageView iv_yinji_film; @BindView(R.id.tv_yinji_film) TextView tv_yinji_film; @BindView(R.id.rl_duibidu_film) RelativeLayout rl_duibidu_film; @BindView(R.id.iv_duibidu_film) ImageView iv_duibidu_film; @BindView(R.id.tv_duibidu_film) TextView tv_duibidu_film; //中下部 @BindView(R.id.ll_gallery_film) LinearLayout ll_gallery_film; //滤镜 @BindView(R.id.gallery_filter_film) Gallery gallery_filter_film; BitmapFilterAdapter filterAdapter; //印记 @BindView(R.id.gallery_yinji_film) Gallery gallery_yinji_film; MarkAdapter markAdapter; MyTouchImageView currentMyTouchImageView; //中部 @BindView(R.id.fl_center_imageprocess) FrameLayout fl_center_imageprocess; @BindView(R.id.piv_center_imageprocess) ProcessImageView piv_center_imageprocess; @BindView(R.id.tv_subtitletext_film) TextView tv_subtitletext_film; //对比度 ColorBitmapFilter colorBitmapFilter; //用于保存图像元数据 SaveImage saveImage; Bitmap currentBitmap; //传进来的原始图像 Bitmap currentShowBitmap; //处理过后的图像,同样的处理过程要基于currentBitmap原始图像进行 @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_imageprocess); ButterKnife.bind(this); saveImage = new SaveImage(); saveImage.saveImagePath = getIntent().getStringExtra("imagePath"); initView(); EventBus.getDefault().register(this); } private void initView() { //滤镜 filterAdapter = new BitmapFilterAdapter(ImageProcessActivity.this); gallery_filter_film.setAdapter(filterAdapter); gallery_filter_film.setSelection(2); gallery_filter_film.setSpacing(10); gallery_filter_film.setAnimationDuration(3000); gallery_filter_film.setUnselectedAlpha(5); gallery_filter_film.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { FilterInfo filterInfo = (FilterInfo) filterAdapter.getItem(position); IBitmapFilter bitmapFilter = filterInfo.filter; ColorMatrixColorFilter colorMatrixColorFilter = new ColorMatrixColorFilter(bitmapFilter.createColorMatrix(10)); piv_center_imageprocess.setColorFilter(colorMatrixColorFilter); } }); //印记 markAdapter = new MarkAdapter(ImageProcessActivity.this); gallery_yinji_film.setAdapter(markAdapter); gallery_yinji_film.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { if(currentMyTouchImageView != null) { fl_center_imageprocess.removeView(currentMyTouchImageView); } currentMyTouchImageView = new MyTouchImageView(ImageProcessActivity.this); MarkInfo markInfo = (MarkInfo) markAdapter.getItem(position); currentMyTouchImageView.setImageResource(markInfo.getMarkAdapterResource()); currentMyTouchImageView.setVisibility(View.VISIBLE); fl_center_imageprocess.addView(currentMyTouchImageView); } }); //对比度 colorBitmapFilter = new ColorBitmapFilter(currentShowBitmap); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); int maxWidth = ScreenUtils.getScreenWidth(ImageProcessActivity.this); int maxHeight = ScreenUtils.getScreenHeight(ImageProcessActivity.this); currentBitmap = ImageUtils.getBitmapFromPath(saveImage.saveImagePath, maxWidth, maxHeight); currentShowBitmap = Bitmap.createBitmap(currentBitmap); piv_center_imageprocess.setImageBitmap(currentShowBitmap); } @OnClick({R.id.iv_finish_gallery, R.id.button_next_gallery, R.id.rl_cut_film, R.id.rl_filter_film, R.id.rl_subtitle_film, R.id.rl_yinji_film, R.id.rl_duibidu_film, R.id.tv_subtitletext_film}) public void click(View view) { switch (view.getId()) { case R.id.iv_finish_gallery: finish(); break; case R.id.button_next_gallery: saveResultImages(saveImage); break; case R.id.rl_cut_film: Intent intent_cut = new Intent(ImageProcessActivity.this, CutActivity.class); intent_cut.putExtra(Constants.CROPIMAGEPATH, saveImage.saveImagePath); startActivityForResult(intent_cut, Constants.CUT_IMAGE); break; case R.id.rl_filter_film: gallery_filter_film.setVisibility(View.VISIBLE); gallery_yinji_film.setVisibility(View.GONE); break; case R.id.rl_subtitle_film: Toast.makeText(ImageProcessActivity.this, "未完待续", Toast.LENGTH_SHORT).show(); break; case R.id.rl_yinji_film: gallery_filter_film.setVisibility(View.GONE); gallery_yinji_film.setVisibility(View.VISIBLE); break; case R.id.rl_duibidu_film: gallery_filter_film.setVisibility(View.GONE); gallery_yinji_film.setVisibility(View.GONE); PopupWindow popupWindow_Contrast = PopupWindowFactory.createContrastPopupWindow(ImageProcessActivity.this); popupWindow_Contrast.showAtLocation(view, Gravity.LEFT | Gravity.BOTTOM, 5, 150); popupWindow_Contrast.update(); break; case R.id.tv_subtitletext_film: break; } } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } //EventBus处理 @Subscribe(threadMode = ThreadMode.MAIN) //轻按:显示焦点,完成聚焦和测光。 public void onSeekBarChanged(BitmapProcess.ContrastEvent contrastEvent) { int seekBarNum = contrastEvent.getSeekBarNum(); int progress = contrastEvent.getProgress(); switch (seekBarNum) { case 0: colorBitmapFilter.setSaturation(progress); break; case 1: colorBitmapFilter.SetHue(progress); break; case 2: colorBitmapFilter.SetLum(progress); break; } currentShowBitmap = colorBitmapFilter.process(currentShowBitmap, seekBarNum); piv_center_imageprocess.setImageBitmap(currentShowBitmap); } private void saveResultImages(final SaveImage saveImage) { new Thread(new Runnable() { @Override public void run() { //先保存currentShowBitmap到currentSaveImage.saveImagePath中,此时所有Bitmap都保存到了SD卡中。 if (currentMyTouchImageView != null) { saveImage.yinjiBitmap = currentMyTouchImageView.getResultBitmap(); saveImage.x = (int) currentMyTouchImageView.getStartX(); saveImage.y = (int) currentMyTouchImageView.getStartY(); saveImage.x = (int) currentMyTouchImageView.x_down; saveImage.y = (int) currentMyTouchImageView.y_down; } File file = new File(saveImage.saveImagePath); ImageUtils.saveBitmap(currentBitmap, file.getParent().toString(), file.getName().toString()); //取出SaveImage,从saveImagePath中取出图像,然后绘制字幕,绘制印记,再保存到Constants.resultPath路径下。 Bitmap itemBitmap = ImageUtils.getBitmapFromPath(saveImage.saveImagePath); //水印图 if (saveImage.yinjiBitmap != null) { itemBitmap = ImageUtils.watermarkWithBmp(itemBitmap, saveImage.yinjiBitmap, saveImage.x, saveImage.y); } //带字幕图 if (!TextUtils.isEmpty(saveImage.subtitle)) { int bitmapwidth = itemBitmap.getWidth(); Paint paint = new Paint(); paint.setTextSize(tv_subtitletext_film.getTextSize()); int subtitlewidth = (int) paint.measureText(tv_subtitletext_film.getText().toString()); int x = (bitmapwidth - subtitlewidth) / 2; int y = itemBitmap.getHeight() - 30; int fontSize = 0; int maxSize = Math.max(itemBitmap.getWidth(), itemBitmap.getHeight()); if (maxSize >= 800) { fontSize = 30; } else if (maxSize >= 600) { fontSize = 25; } else if (maxSize >= 400) { fontSize = 20; } else if (maxSize >= 200) { fontSize = 15; } else { fontSize = 12; } itemBitmap = ImageUtils.watermarkWithText(itemBitmap, saveImage.subtitle, x, y, fontSize, R.color.text); } File itemFile = new File(saveImage.saveImagePath); ImageUtils.saveBitmap(itemBitmap, itemFile.getParent().toString(), itemFile.getName().toString()); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(ImageProcessActivity.this, "Save Success", Toast.LENGTH_LONG).show(); } }); } }).start(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Constants.CUT_IMAGE: if(resultCode == RESULT_OK) { String path = data.getStringExtra(Constants.CROPIMAGEPATH); currentShowBitmap = ImageUtils.getBitmapFromPath(path); piv_center_imageprocess.setImagePath(path); piv_center_imageprocess.setImageBitmap(currentShowBitmap); } break; } } }