`
gryphone
  • 浏览: 433731 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Bitmap 相关2:Bitmap.createBitmap() 使用

阅读更多
写道

 Bitmap 创建

 

写道
我们不能总是依赖于BitmapFactory 下面告诉大家怎么从Bitmaqp中截取某一部分创建新的Bitmap

系统会有一个默认png图片:icon.png 但是这个图片中最外层会有白色的 比较讨厌 现在以此为例 说说怎么截取 因为其外层为白色 显示不出来 所以我用了 *.9.png 作为其边界

 

 

 

[代码 步骤]

1. 创建Bitmaop 且指向icon.png

Bitmap ori = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);

 

 

2. 创建布局文件 有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>

 

 

3. 初始化变量

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

 

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

width = ori.getWidth();
height = ori.getHeight();

 

5.  定义变量 标志切割位置 并初始化之

int startX,startY,lengthX,lengthY;

 

startX = 0;
startY = 0;

lengthX = width;
lengthY = height;

 

 

 6. 如何选取图片位置

写道
函数原型: 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;
    }

 

 

7.  还需要判断移动是否合理

以下几种情况不合理:

1. 当图形左边 比 图形最大宽度 还大
2. 当图形上边 比 图形最大高度 还大
3. 图形宽度 或 高度 小于 0

 

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

 

 

8. 具体移动方法:

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();
    	
    }

 

 

 

9. emulator 运行情况: 

 

分享到:
评论

相关推荐

    安卓Android源码——(Bitmap位图渲染与操作).zip

    - **裁剪**:使用Bitmap.createBitmap()方法可以裁剪Bitmap的一部分。 - **合并**:可以将多个Bitmap拼接在一起,创建新的Bitmap。 - **颜色转换**:通过ColorFilter或者PorterDuff.Mode实现Bitmap颜色的变化。 ...

    处理bitmap内存溢出问题

    `inSampleSize`是`BitmapFactory.Options`类中的一个重要属性,它允许开发者指定在解码`Bitmap`时应使用的下采样率。通过增加`inSampleSize`的值,可以减少最终`Bitmap`的尺寸和内存占用。例如: ```java ...

    TPNGImage 1.5

    Bitmap := TBitmap.Create; PNG := TPNGObject.Create; {In case something goes wrong, free booth Bitmap and PNG} try Bitmap.LoadFromFile(Source); PNG.Assign(Bitmap); //Convert data into png PNG....

    Android应用源码之(Bitmap位图渲染与操作).zip

    - **裁剪**:`createBitmap()`配合`Canvas.drawBitmap()`可以实现裁剪效果。 - **缩放**:`Bitmap.createScaledBitmap()`用于缩放Bitmap。 - **旋转**:可以使用Matrix的`postRotate()`方法旋转Bitmap。 - **...

    Android下利用Bitmap切割图片

    切割图片通常指的是从原始图片中提取出一个矩形区域,这个操作在Android中可以通过Bitmap.createBitmap方法实现。以下是一个简单的示例,展示如何从Bitmap中裁剪出指定大小和位置的子Bitmap: ```java // 原始...

    Delphi 全屏抓图 范例.rar

     Fullscreen:=TBitmap.Create;//创建一个BITMAP来存放图象  Fullscreen.Width:=screen.width;  Fullscreen.Height:=screen.Height;  DC:=GetDC(0);//取得屏幕的DC,参数0指的是屏幕  FullscreenCanvas:=TCanvas...

    winform下Bitmap转wpf下ImageSource

    2. **字节数组到WPF的BitmapSource**:接着,使用`System.Windows.Media.Imaging.BitmapFrame.Create`静态方法从字节数组创建`BitmapSource`。这个方法接受字节数组和一些元数据,如编码、宽度、高度等。 ```csharp...

    Android性能优化(七)Bitmap内存压缩示例源码BitMapCache.zip

    通过`Bitmap.Config.ARGB_8888.config`和`Bitmap.createBitmap()`创建的Bitmap可以放入池中。 6. **避免在主线程中处理Bitmap**:加载、解码和操作Bitmap应在子线程中进行,以防止阻塞UI线程导致应用无响应。 7. *...

    初中级Android开发社招面试之Bitmap

    - 使用Bitmap.createBitmap()动态创建Bitmap时,要考虑内存预算,避免内存溢出。 - 使用完Bitmap后,调用recycle()方法回收内存,但需要注意,一旦回收,不能再使用。 - 使用软引用(SoftReference)或弱引用...

    CreateBitmap-Test-20200310.rar

    本篇文章将深入探讨`CreateBitmap`函数的使用,并通过三个实际示例来演示其用法。 `CreateBitmap`函数的基本语法如下: ```cpp HBITMAP CreateBitmap( int nWidth, int nHeight, UINT cPlanes, UINT ...

    系统截屏源码

    //创建一个BITMAP来存放图象 Fullscreen.Width:=screen.width; Fullscreen.Height:=screen.Height; DC:=GetDC(0); //取得屏幕的DC,参数0指的是屏幕 FullscreenCanvas:=TCanvas.Create; //创建一个CANVAS对象 ...

    Bitmap加载、变换、显示图片

    - **裁剪**:使用`Bitmap.createBitmap(Bitmap source, int left, int top, int width, int height)`可以从源Bitmap中裁剪出新的Bitmap。 - **调整颜色**:可以使用`ColorMatrix`和`ColorFilter`对Bitmap的颜色...

    android Bitmap用法总结

    Bitmap bitmap = Bitmap.createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); ...

    DelphiPNGImage_delphi_image_image显示png_png_图片_

    Bitmap := TGdiPlusBitmap.Create; try if not Bitmap.LoadFromMemory(PNGData, PNGSize) then raise Exception.Create('Failed to load PNG'); Result := TBitmap.Create; Result.HandleType := bmDIB; ...

    Android-使用Matrix对Bitmap进行处理

    当我们需要对Bitmap应用Matrix变换时,可以使用Bitmap.createBitmap方法,它接受原始Bitmap、新的宽度和高度以及Matrix作为参数。Matrix会根据给定的变换规则对图像进行处理,生成一个新的Bitmap。例如,以下代码...

    delphi抓图、截屏,初学者看

    2. **复制屏幕到Bitmap**:使用`BitBlt`函数从设备上下文(DC,Device Context)复制屏幕内容到Bitmap。设备上下文是GDI用来表示图形设备的抽象,可以通过`GetDC`函数获取屏幕的设备上下文。 ```delphi var ...

    Bitmap保存为文件

    创建`HBITMAP`通常通过调用`CreateBitmap`、`CreateDIBitmap`或`CreateCompatibleBitmap`函数完成,这些函数允许我们创建不同类型的位图。 在“Bitmap保存为文件”这个示例工程中,核心任务是将`HBITMAP`对象的内容...

    delphi 两张图片叠加

    Image1, Image2: TImage; Bitmap1, Bitmap2, CombinedBitmap: TGDIPlusBitmap; Graphics: TGDIPlusGraphics; BlendFactor: Single; begin // 初始化两张图片组件 Image1 := TImage.Create(nil); Image2 := ...

    FairyGUI-Unity-Plugin-3.4.0.zip

    - IMPROVED: Change the way of registering bitmap font. - FIXED: A GButton pivot issue. - FIXED: Correct text align behavior. 2.3.0 - NEW: Allow loader to load component. - NEW: Add text template ...

    演示 创建 OBJ_BITMAP 脚本 - MetaTrader 5脚本.zip

    2. **创建OBJ_BITMAP对象**:使用`ObjectCreate()`函数创建OBJ_BITMAP对象,需要指定对象的名称、起始和结束坐标以及位图文件的句柄。对象的位置应该根据图表的大小进行调整,以确保图像正确显示。 3. **设置对象...

Global site tag (gtag.js) - Google Analytics