图片裁剪--通过拖拽截图指定区域图片

view类:

 

/**
 * 图像选取类,可以拖拽截取指定区域的图像.
 *
 * @author hhf
 */
package com.PicRect;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class RectImageView extends View{
 
 float DownX,DownY,NowX,NowY;
 boolean isFigureLeave = true;
 boolean isSelected = false;
 Paint paint;
 Bitmap bmp_BG;
 
 OnImageSelectedListener Listener = null;

 public RectImageView(Context context){
  super(context);
  Init();
 }
 
 public RectImageView(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
  Init();
 }

 private void Init(){
  paint = new Paint();
  paint.setARGB(128, 255, 0, 0);
  DownX = DownY = NowX = NowY = 0;
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  super.onDraw(canvas);
  
  if(bmp_BG!=null)
   canvas.drawBitmap(bmp_BG,0,0,paint);
  else
   canvas.drawText("No Bitmap!", 0, 0, paint);
  
  if(DownX!=NowX)
   DrawRect(canvas);
  
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  // TODO Auto-generated method stub
  float x = event.getX();
  float y = event.getY();
  switch(event.getAction()){
  case MotionEvent.ACTION_MOVE:
   if(x<0)
    x = 0;
   if(y<0)
    y = 0;
   NowX = x<bmp_BG.getWidth()?x:bmp_BG.getWidth();
   NowY = y<bmp_BG.getHeight()?y:bmp_BG.getHeight();
   break;
  case MotionEvent.ACTION_UP:
   isFigureLeave = true;
   if(Listener != null)
   {
    Listener.OnImageSelected(GetRectBitmap());
   }
   isSelected = true;
   break;
  case MotionEvent.ACTION_DOWN:
   isFigureLeave = false;
   DownX = NowX = x<bmp_BG.getWidth()?x:bmp_BG.getWidth();
   DownY = NowY = y<bmp_BG.getHeight()?y:bmp_BG.getHeight();
   break;
  }
  invalidate();
  return true;
 }
 
 private void DrawRect(Canvas canvas){
  canvas.drawLine(DownX, DownY, DownX, NowY, paint);
  canvas.drawLine(DownX, DownY, NowX, DownY, paint);
  canvas.drawLine(NowX, NowY, DownX, NowY, paint);
  canvas.drawLine(NowX, NowY, NowX, DownY, paint);
  return;
 }
 private Bitmap GetRectBitmap(){
  int x,y,w,h;
  x = (int) (DownX>NowX?NowX:DownX);
  y = (int) (DownY>NowY?NowY:DownY);
  w = Math.abs((int)(DownX - NowX));
  h = Math.abs((int)(DownY - NowY));
  if(w>0&&h>0)
   return Bitmap.createBitmap(bmp_BG, x, y, w, h);
  else
   return null;
 }
 /*************************************************************************/
 /**
  * 设置画笔颜色
  *
  * @param 要设置的画笔
  */
 public void SetPaint(Paint paint){
  this.paint = paint;
  return;
 }
 /**
  * 设置要选取的图像
  *
  *@param 欲被选取的Bitmap
  */
 public void SetBitmap(Bitmap bm){
  this.bmp_BG = bm;
  invalidate();
 }
 /**
  * 获取选取的图像
  * @return 返回当前选取的图像,若没有选取范围则返回null
  */
 public Bitmap GetSelectBitmap(){
  if(isSelected)
   return GetRectBitmap();
  else
   return null;
 }
 /**
  * 清除选定区域(重置)
  */
 public void ResetSelectRect(){
  isSelected = false;
  DownX = DownY = NowX = NowY = 0;
  invalidate();
 }
 /**
  * 设置选择监听器
  * @param l
  */
 public void SetOnImageSelectedListener(OnImageSelectedListener l){
  Listener = l;
 }
}

OnImageSelectedListener:

/**
 * 图像选取接口类
 * @author hhf
 */
package com.PicRect;

import android.graphics.Bitmap;

public interface OnImageSelectedListener{
 /**
  * 当图像选取动作完成后被调用
  * @param bitmap
  */
 abstract void OnImageSelected(Bitmap bitmap);
}


activity:

/**
 * 图像选取demo.
 *
 * @author hhf
 *
 */
package com.PicRect;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;

public class Main extends Activity implements OnImageSelectedListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        RectImageView RIV = (RectImageView)findViewById(R.id.RIV);

        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);

        RIV.SetBitmap(bm);
        RIV.SetOnImageSelectedListener(this);
    }

 @Override
 public void OnImageSelected(Bitmap bitmap) {
  // TODO Auto-generated method stub
  ImageView IV = (ImageView)findViewById(R.id.IV);
  IV.setImageBitmap(bitmap);
 }
}


xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 <TextView 
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/hello"/>
 <ImageView
  android:id="@+id/IV"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"/>
 <com.PicRect.RectImageView
  android:id="@+id/RIV"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"/>
</LinearLayout>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
================================================================================================== 电子地图一把抓V1.0 Google Earth非完美版及无损压缩版 解决了电子地图一把抓原版的下列问题: ● 抓Google Earth卫图时导致地球旋转,无法正确抓图的问题 ● 抓非卫图地图时,在道路边界及文字附近出现噪点问题。去除噪点后,可以制作出更清晰、也更小的最终文件 GE非完美版的非完美性表现在: 抓Google Earth带KML/KMZ地标显示的卫图时,在某次自动移动地球时,若GE抓手下方恰好有图标,在目前最新的 GE V4.3beta版中测试的结果看,抓手会“滑”一小段,导致错位。 但实测无图标显示的KML/KMZ或关闭其图标,显示道路及面状物时,未测出问题(未进行大量测试)。因此电子地 图一把抓GE非完美版可以制作GE卫图底图+不带图标的KML/KMZ的地图。有图标时,需仔细检查,有问题可稍微改 变一下起点位置或抓图区域大小重抓试验。 可执行文件说明: MapCap.exe 原版本 MapCap_LZW.exe 24位模拟式下将TIF文件从有损JPEG压缩改为无损LZW压缩,解决图像出现噪点的问题。 推荐用于抓取非卫图的地图。 MapCap_GE.exe 用于Google Earth,非完美(屏幕上图标较密集时有可能导致错位)。存储的结果TIF 文件24位模式下与原版一样,采用有损JPEG压缩。 MapCap_GE_LZW.exe 同MapCap_GE.exe,但24位模拟式下采用无损LZW压缩。 推荐用于抓取Google Earth卫图,特别是带KML显示时,但有图标显示时需仔细检查结果 是否有错位的现象。 注:电子地图一把抓的所有权利完全归原作者Kenchang所有。感谢Kenchang编写这么实用又有生命力的软件。 2009.1.2 ================================================================================================== kenchang对原版的说明: 1、软硬件要求 2、安装卸载说明 3、已知问题 4、版权声明 1、软硬件要求 可运行在Windows98/ME/2000/XP之上,CPU为奔腾133以上,内存32M以上。抓取大图时会需要大量内存, 建议内存为512M以上。 2、安装卸载说明 本软件为绿色软件,将所有文件复制到同一目录中,运行mapcap.exe即可。删除时将该目录下的所有文件删除。 3、已知问题 本软件未经广泛测试,谬误在所难免 4、版权声明 本软件为免费软件,不提供任何形式的技术支持。本软件仅供学习交流用途, 不得用于任何形式的商业目的或其他非法目的,在抓图之前应先取得原版权所有者的同意, 使用本软件造成的任何后果均与本软件作者无关。 kenchang
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值