当前位置:  php iis7站长之家
本页文章导读:
    ▪TextView从适改变高度        TextView自适改变高度 sizeWithFont:constrainedToSize:lineBreakMode:     Returns the size of the string if it were rendered with the specified constraints. - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UIL.........
    ▪ bitmap drawable byte 变换        bitmap drawable byte 转换 /** 将一个图片由Drawable格式转化为 Bitmap格式 */   public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap.createBitmap( drawable.getIntrinsicWidth(), drawabl.........
    ▪ Bitmap种getPixels()方法中参数stride理解       Bitmap类getPixels()方法中参数stride理解   在学习Graphics中遇到位图(Bitmap)中getPixels()方法,对该方法的用法大体理解,但对其中的stride参数却不明白具体的用法以及用意,经过一番折腾后,有.........

[1]TextView从适改变高度
    来源: 互联网  发布时间: 2014-02-18
TextView自适改变高度

sizeWithFont:constrainedToSize:lineBreakMode:

 

 

Returns the size of the string if it were rendered with the specified constraints.

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode

Parameters

font

The font to use for computing the string size.

size

The maximum acceptable size for the string. This value is used to calculate where line breaks and wrapping would occur.

lineBreakMode

The line break options for computing the size of the string. For a list of possible values, see “UILineBreakMode.”

Return Value

The width and height of the resulting string’s bounding box.

Discussion

You can use this method to obtain the layout metrics you need to draw a string in your user interface. This method does not actually draw the string or alter the receiver’s text in any way.

This method computes the metrics needed to draw the specified string. This method lays out the receiver’s text and attempts to make it fit the specified size using the specified font and line break options. During layout, the method may break the text onto multiple lines to make it fit better. If the receiver’s text does not completely fit in the specified size, it lays out as much of the text as possible and truncates it (for layout purposes only) according to the specified line break mode. It then returns the size of the resulting truncated string. If the height specified in the size parameter is less than a single line of text, this method may return a height value that is bigger than the one specified.

 

 

 

retun CGSize and get the value 

[curretSize hight];

 

CGRect * cg = [320,[currrent hight]];


    
[2] bitmap drawable byte 变换
    来源: 互联网  发布时间: 2014-02-18
bitmap drawable byte 转换

/** 将一个图片由Drawable格式转化为 Bitmap格式 */

 

public static Bitmap drawableToBitmap(Drawable drawable) {

Bitmap bitmap = Bitmap.createBitmap(
	          drawable.getIntrinsicWidth(),
	          drawable.getIntrinsicHeight(),
	          drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
						: Bitmap.Config.RGB_565);
	 Canvas canvas = new Canvas(bitmap);
	drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
	drawable.getIntrinsicHeight());
	drawable.draw(canvas);
	return bitmap;
	}

 

/** 讲byte[] 转换为 bitmap格式 */

 

public static  byte[] bitmap2Bytes(Bitmap bm){
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
		return baos.toByteArray();
	}

 

/**bitmap 转换为 byte[]格式 */

 

public static Bitmap bytes2Bitmap(byte[] bytes){
		if(bytes == null || bytes.length == 0){
			return null;
		}
		return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
	}

 


    
[3] Bitmap种getPixels()方法中参数stride理解
    来源: 互联网  发布时间: 2014-02-18
Bitmap类getPixels()方法中参数stride理解
  在学习Graphics中遇到位图(Bitmap)中getPixels()方法,对该方法的用法大体理解,但对其中的stride参数却不明白具体的用法以及用意,经过一番折腾后,有些明了,现记述过程如下:

行文有些详细,请赶时间的同学直接跳到红字总结处查看!!
getPixels()方法的用处为获取位图(Bitmap)中的根据方法参数所决定的像素值(颜色值),存入类型为int的pixels数组中,至于从RGB转换为int数值的算法是什么,暂时不知,存疑!!

Android英文SDK中有关getPixels()方法的介绍如下:
(引自Android SDK官网,链接请见附后1)

public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)

Since: API Level 1
Returns in pixels[] a copy of the data in the bitmap. Each value is a packed int representing a Color. The stride parameter allows the caller to allow for gaps in the returned pixels array between rows. For normal packed results, just pass width for the stride value.
Parameters

pixels The array to receive the bitmap's colors
offset The first index to write into pixels[]
stride The number of entries in pixels[] to skip between rows (must be >= bitmap's width). Can be negative.
x The x coordinate of the first pixel to read from the bitmap
y The y coordinate of the first pixel to read from the bitmap
width The number of pixels to read from each row
height The number of rows to read
Throws

IllegalArgumentException if x, y, width, height exceed the bounds of the bitmap, or if abs(stride) < width.
ArrayIndexOutOfBoundsException if the pixels array is too small to receive the specified number of pixels. 


看完英文文档仍然不甚明白,于是去搜了下中文Android文档相应内容,如下(引自农民伯伯博客,链接请见附后2):

public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)

把位图的数据拷贝到pixels[]中。每一个都由一个表示颜色值的int值来表示。幅度参数表明调用者允许的像素数组行间距。对通常的填充结果,只要传递宽度值给幅度参数。
参数
pixels      接收位图颜色值的数组
offset      写入到pixels[]中的第一个像素索引值
stride      pixels[]中的行间距个数值(必须大于等于位图宽度)。可以为负数
x           从位图中读取的第一个像素的x坐标值。
y           从位图中读取的第一个像素的y坐标值
width      从每一行中读取的像素宽度
height    读取的行数              
异常
IilegalArgumentExcepiton       如果x,y,width,height越界或stride的绝对值小于位图宽度时将被抛出。
ArrayIndexOutOfBoundsException          如果像素数组太小而无法接收指定书目的像素值时将被抛出。

看完后仍然对Stride解释中的"行间距"不太明白,去查了下Stride在英语中的原义
Stride在柯林斯中的英英释义如下:

1 If you stride somewhere, you walk there with quick, long steps.
  stride意为"大踏步快速前进"
2 A stride is a long step which you take when you are walking or running.
  stride在此做名词,意为"大步"
3 Someone's stride is their way of walking with long steps.
  指代某人具体迈大步的方式.

于是可以把stride理解为人行走过程中所迈大步的一段距离,而在此方法中可以理解为每行的像素数,至于用处是什么,还要继续寻找答案.

然后去StackOverFlow去搜了搜"getPixels() stride"关键字,查找到如下信息:

1  In most cases the stride is the same as the width. The stride is useful if you are trying to copy/draw a sub-region of a Bitmap. For instance, if you have a 100x100 bitmap and you want to draw the 50x50 top-right corner, you can use a width of 50px and a stride of 100px.(链接请见附后3)

2  Stride is number of bytes used for storing one image row.

Stride can be different from the image width.

Most of the images are 4 byte aligned.

For ex. a 24 bit (RGB) image with width of 50 pixels. The total bytes required will be 150 (3(RGB)*50). As image will be 4 byte aligned, in this case the byte required will become 154.

So you will see stride as 154, width 50 and image alignment as 4 byte.(链接请见附后3)

上面内容表示stride参数有两种用处

第一种:
可以截取图片中部分区域或者图片拼接.

截图:假设读取像素值的原图片宽为w,高为h,此时设置参数pixels[w*h], 参数stride为 w ,参数offset为0,参数x ,y为截图的起点位置,参数width和height为截图的宽度和高度,则此方法运行后,返回的pixels[]数组中从pixels[0]至pixels[width*height-1]里存储的是从图片( x , y )处起读取的截图大小为width * height的像素值.
示例:修改Android SDK自带的AipDemo程序中BitmapDecode示例,更换图像为自制四角四色图:


图像大小为100*100,想截取图片右上1/4图像(图上黄色部分)修改程序部分代码为:

mBitmap2.getPixels(pixels, 0, w, 50, 0, w/2, h/2);
            String text = String.valueOf(pixels[10]);
            Log.i(SampleView.VIEW_LOG_TAG,text);
            mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h,
                                           Bitmap.Config.ARGB_8888);
            mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h,
                                           Bitmap.Config.ARGB_4444);

运行后得到如下结果:





现在我们看到右边两副ARGB_8888,ARGB_4444图像隐约只在左上角显示原图右上的1/4黄色部分,其余部分为背景色白色,那么问题又来了,此时ARGB_8888,ARGB_4444图像大小为多少?还是原图的大小(100*100)吗,或者是(50*50)了,不然背景色为何是画布的背景色呢?那么把
pixels[100*100]数组设初始值看下情况(通过Log.i()我查到了pixels中存储的像素值为百万左右的负整数,所以这里胡乱取个数-2578654做为初始值,颜色不太好,请见谅),修改后代码如下:
int[] pixels = new int[w*h];
            for(int i=0; i < w*h; i++){
            	pixels[i] = -2578654;
            }
            mBitmap2.getPixels(pixels, 0, w, 50, 0, w/2, h/2);
            String text = String.valueOf(pixels[10]);
            Log.i(SampleView.VIEW_LOG_TAG,text);
            mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h,
                                           Bitmap.Config.ARGB_8888);
            mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h,
                                           Bitmap.Config.ARGB_4444);

运行后结果为:






这样我们就可以看到结果了,如果pixels[]中的数值为int默认值(0)的话,图片相应的部分就为背景色,如果设置为别的初始值而在运行中没有被修改的话就还是原样.


下面设置下getPixels[]方法中offset,使得黄色部分截图出现在它在原图中的位置,
offset = x + y*w ,本例代码如下:
mBitmap2.getPixels(pixels, 50, w, 50, 0, w/2, h/2);

运行结果如下





当然可以用这个方法进行更复杂的运算,诸如截取素材图片修改目标图片(已存储至pixels数组中)的指定区域!!


图片拼接:

假设两张图片大小都为 w * h ,getPixels()方法中设置参数pixels[2*w*h],参数offset = 0,stride = 2*w读取第一张图片,再次运行getPixels()方法,设置参数offset = w,stride = 2*w,读取第二张图片,再将pixels[]绘制到画布上就可以看到两张图片已经拼接起来了.
示例如下:
int w = mBitmap2.getWidth();
            int h = mBitmap2.getHeight();
            int n = 2*w;
            Log.i(SampleView.VIEW_LOG_TAG,String.valueOf(w*h));
            int[] pixels = new int[n*h];
            for(int i=0; i < n*h; i++){
            	pixels[i] = -2578654;
            }
            mBitmap2.getPixels(pixels, 0, n, 0, 0, w, h);
            mBitmap2.getPixels(pixels, w, n, 0, 0, w, h);
            mBitmap3 = Bitmap.createBitmap(pixels, 0, n, n, h,
                                           Bitmap.Config.ARGB_8888);

运行结果如下
 




第二种: 
stride表示数组pixels[]中存储的图片每行的数据,在其中可以附加信息,即
stride = width + padding,如下图所示(图片引自链接请见附后4)





这样可以不仅仅存储图片的像素信息,也可以储存相应每行的其它附加信息.


最后,stride参数的意义及用处总结如下:

1 用来表示pixels[]数组中每行的像素个数,用于行与行之间区分,绝对值必须大于参数width,但不必大于所要读取图片的宽度w(在width < w 时成立).(stride负数有何作用不知,存疑).另,pixels.length >= stride * height,否则会抛出ArrayIndexOutOfBoundsException 异常

2 stride > width时,可以在pixels[]数组中添加每行的附加信息,可做它用.

附后:
1, int, int, int, int, int, int)]Android英文文档getPixels()方法介绍

2 Android中文文档getPixels()方法介绍

3 StackOverflow中关于getPixels()问答.

4 图片来源
1 楼 renpeng301 2012-03-27  
透彻
2 楼 smilett12345 2012-04-01  
受益匪浅
3 楼 lovexp2010 2012-06-20  
  

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3