Android实现位图剪切

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android实现位图剪切相关的知识,希望对你有一定的参考价值。

我们不能总是依赖于BitmapFactory 以下告诉大家怎么从Bitmaqp中截取某一部分创建新的Bitmap 
系统会有一个默认png图片:icon.png 可是这个图片中最外层会有白色的 比較讨厌 如今以此为例 说说怎么截取 由于其外层为白色 显示不出来 所以我用了 *.9.png 作为其边界

 技术分享

 


创建Bitmaop 且指向icon.png

<span style="font-size:12px;">Bitmap ori = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);  </span>


创建布局文件 有2个ImageView 一个供原图显示 一个供分割后显示

<?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"  
    android:id="@+id/layout"  
    >  
<ImageView    
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:id="@+id/image1"  
    android:layout_gravity="center_horizontal"  
    />  
<ImageView    
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:id="@+id/image2"  
    android:layout_gravity="center"  
    />  
</LinearLayout>  


初始化变量

lLauout = (LinearLayout)findViewById(R.id.layout);  
          
iv1 = (ImageView)findViewById(R.id.image1);  
iv2 = (ImageView)findViewById(R.id.image2);  

得到原图的宽度与高度 供后面使用

<span style="font-size:12px;">width = ori.getWidth();  
height = ori.getHeight();  </span>



定义变量 标志分割位置 并初始化之

<span style="font-size:12px;"><span class="keyword" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px; color: rgb(127, 0, 85); font-weight: bold;">int</span><span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px;"> startX,startY,lengthX,lengthY; </span></span>

<span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px;"></span>

<span style="font-size:12px;">startX = 0;  
startY = 0;  
  
lengthX = width;  
lengthY = height;  </span>


怎样选取图片位置

函数原型: Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height) 

方法1:不断调整參数:x,y,width,heighy 
方法2:利用导航键 上下左右分别控制上述4变量 
导航键 左: x 
导航键 右: width 
导航键 上: y 
导航键 下: height 
使之向图片中央靠拢 且按下一下 移动固定的距离

public boolean onKeyDown(int keyCode, KeyEvent msg){  
          
        switch(keyCode){  
        case KeyEvent.KEYCODE_DPAD_LEFT:  
            updateLeft();  
            break;  
              
        case KeyEvent.KEYCODE_DPAD_RIGHT:  
            updateRight();  
            break;  
        case KeyEvent.KEYCODE_DPAD_UP:  
            updateUp();  
            break;  
        case KeyEvent.KEYCODE_DPAD_DOWN:  
            updateDown();  
            break;  
        case KeyEvent.KEYCODE_DPAD_CENTER:  
            showResult();  
            break;  
        }  
          
        return false;  
    }  

 

还须要推断移动是否合理

下面几种情况不合理:    
1. 当图形左边 比 图形最大宽度 还大  
2. 当图形上边 比 图形最大高度 还大  
3. 图形宽度 或 高度 小于 0 

public boolean isUpdateOK(){  
        if((startX > lengthX)||(startY > lengthY)||(lengthX > 0)||(lengthY > 0)){  
            return false;  
        }  
        else {  
            return true;  
        }  
    }  


详细移动方法

public void updateLeft(){  
        startX += step;  
        lengthX = width-startX;  
        lengthY = height-startY;  
          
        if(isUpdateOK()){  
            target1.recycle();  
              
            target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY);  
              
            iv2.setImageBitmap(target1);  
              
            setContentView(lLauout);  
        }  
    }  
    public void updateUp(){  
        startY += step;  
        lengthX = width-startX;  
        lengthY = height-startY;  
          
        if(isUpdateOK()){  
            target1.recycle();  
              
            target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY);  
              
            iv2.setImageBitmap(target1);  
              
            setContentView(lLauout);  
        }  
    }  
    public void updateRight(){  
        lengthX -= step;  
          
        if(isUpdateOK()){  
            target1.recycle();  
              
            target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY);  
              
            iv2.setImageBitmap(target1);  
              
            setContentView(lLauout);  
        }  
    }  
    public void updateDown(){  
        lengthY -= step;  
          
        if(isUpdateOK()){  
            target1.recycle();  
              
            target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY);  
              
            iv2.setImageBitmap(target1);  
              
            setContentView(lLauout);  
        }  
    }  
      
      
    public void showResult(){  
        AlertDialog.Builder ab = new AlertDialog.Builder(this);  
        AlertDialog aDialog;  
          
        ab.setMessage("startX:"+startX+"\n"+"startY:"+startY+"\n"+"lengthX:"+lengthX+"\n"+"lengthY:"+lengthY).setTitle("show result").show();;  
        aDialog = ab.create();  
  
        aDialog.show();  
          
    }  


emulator 执行情况: 

 技术分享

























以上是关于Android实现位图剪切的主要内容,如果未能解决你的问题,请参考以下文章

从原始位图剪切图像

修剪位图会导致底部文本被剪切

Android - 片段中的 getIntent()

如何从Android片段中的相机获取图像

如何在android中使用imageloader释放位图内存?

android-调用系统的ContentPrivder获取单张图片实现剪切做头像及源代码下载