change the ratio aspect of bitmap

一、将图片按自己的要求缩放

// 图片源
Bitmap bm = BitmapFactory.decodeStream(getResources()
.openRawResource(R.drawable.dog));
// 获得图片的宽高
int width = bm.getWidth();
int height = bm.getHeight();
// 设置想要的大小
int newWidth = 320;
int newHeight = 480;
// 计算缩放比例
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 取得想要缩放的matrix参数
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix,
true);
// 放在画布上
canvas.drawBitmap(newbm, 0, 0, paint);

二、bitmap的用法

BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = 2; //将图片设为原来宽高的1/2,防止内存溢出
Bitmap bm = BitmapFactory.decodeFile(“”,option);//文件流

URL url = new URL(“”);
InputStream is = url.openStream();
Bitmap bm = BitmapFactory.decodeStream(is);

 android:scaleType:

android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:

  •   CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
  •   CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
  •   CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
  •   FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
  •   FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
  •   FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
  •   FIT_XY / fitXY 把图片 不按比例 扩大/缩小到View的大小显示
  •   MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
Bitmap.createScaledBitmap(Bitmap,width,height,true); //第一个参数是待修改的Bitmap,第二第三个参数分别为修改后的宽、高

android.graphic【android】

Canvas

It represents a surface that can have things drawn to it. The Canvas class provides methods for you to:

  • Draw primitives such as simple shapes and paths
  • Draw bitmaps
  • Draw text
  • Clip drawing operations
  • Translate, scale, rotate, or otherwise transform the canvas’s image
  • Save and restore drawing states

Paint

The Paint class in Android functions in a similar capacity of the physical brush: several different brushes that all have different properties, and you use each one for a different purpose.

  • could  give a Paint object which contains the properties with which you want that drawing operation to use.
  • could have as many different paint objects as you like, and you can use any of them for each drawing operation performed on a canvas.
  • can use any of them for each drawing operation performed on a canvas

The properties that a Paint object encapsulates are:

  • Drawing Color
  • Primitive drawing style (solid ‘fill’ or outline ‘stroke’)
  • Stroke style attributes
  • Fill shader
  • Text drawing font attributes
  • Color filter
  • Mask filter
  • Transfer mode
  • Shadow layer

Paint类相当于一个笔刷和调色板。它可以选择如何使用上面描述的draw方法来渲染绘制在画布上的基本图形。通过修改Paint对象,可以在绘图的时候控制颜色、样式、字体和特殊效果。除了这些简单的控制之外,Paint类还支持透明度,另外,它也可以通过使用各种各样的阴影、过滤器效果进行修改,从而提供由更丰富的、复杂的画笔和颜料组成的调色板

Android SDK包含了一些非常好的实例,它们说明了Paint类中可用的大部分功能。你可以在API demos的graphics子目录中找到它们:sdk root folder]\samples\ApiDemos\src\com\android\samples\graphics

使用透明度
Android中的所有颜色都包含了一个不透明组件(alpha通道)
当创建一个颜色的时候,可以使用argb或者parseColor方法来定义它的alpha值,如下所示:
// 使用红色,并让它50%透明
int opacity = 127;
int intColor = Color.argb(opacity, 255, 0, 0);
int parsedColor = Color.parseColor("#7FFF0000");
//也可以使用setAlpha方法来设置已存在的Paint对象的透明度:让颜色50%透明
int opacity = 127;
myPaint.setAlpha(opacity);

可以在任何使用了颜色的类或者方法中使用透明效果,包括Paint、ShaderMask Filter

Shader介绍

Shader类的派生类可以创建允许使用多种固体颜色填充绘图对象的Paint。
对Shader最常见的使用是定义渐变填充;渐变是在2D图像中添加深度和纹理的最佳方式之一。Android包含了一个Bitmap Shader和一个Compose Shader,同时,还包含了三个渐变的Shader。
Bitmap
Every canvas has exactly one underlying Bitmap object.

The bitmap holds the actual pixel data of the image. Whereas the Canvas class provides a high level interface to draw shapes, paths, text, and so on, the Bitmap class provides a more low-level interface to the image, allowing you to manipulate the pixels directly.

Bitmap.Config是内部枚举类表示位图的颜色配置,

  • 它的颜色配置有ALPHA_8、ARGB_4444、ARGB_8888、RGB_565

Bitmap是使用像素阵列来表示的图像,每个像素的颜色信息由RGB组合或者灰度值表示。根据颜色信息所需的数据位分为1、4、8、16、24及32位等,位数越高颜色越丰富,相应的数据量越大。

  • 使用1位表示一个像素颜色的位图因为一个数据位只能表示两种颜色,所以又称为二值位图。
  • 使用24位RGB组合数据位表示的的位图称为真彩色位图。
  • 一般来说,位图是没有经过压缩的,位图文件体积比较大。(位图常用的压缩算法是通过“索引颜色表”实现的),
  • 位图大多支持alpha通道(透明通道)。
  • RGB编码方式: 位图颜色的一种编码方法,用红、绿、蓝三原色的光学强度来表示一种颜色。 直接用于屏幕显示。
  • CMYK编码方式: 位图颜色的一种编码方法,用青、品红、黄、黑四种颜料含量来表示一种颜色。直接用于彩色印刷。
  • 色彩位数,即位图中要用多少个二进制位来表示每个点的颜色,是分辨率的一个重要指标。常用有1位(单色),2位(4色,CGA),4位(16色,VGA),8 位(256色),16位(增强色),24位和32位(真彩色)等。色深16位以上的位图还可以根据其中分别表示RGB三原色或CMYK四原色色深16位以上的位图还可以根据其中分别表示RGB三原色或CMYK四原色的位数进一步分类,如16位位图图片还可分为R5G6B5,R5G5B5X1(有1位不携带信息),R5G5B5A1,R4G4B4A4 等等。

Xfermode

Xfermode is the base class for objects that are called to implement custom “transfer-modes” in the drawing pipeline. 通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式 : 在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。

color blending, image compositing, small explanation about Transfer modes algorithms, source color, destenation color and op color

AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);    borderPen.setXfermode(avoid);

Xfermode子类:

  • AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
  • PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作
  • PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互

16条Porter-Duff规则:
1.PorterDuff.Mode.CLEAR
2.PorterDuff.Mode.SRC //
表示下面要绘制的文本应在上面绘制的圆的上层
3.PorterDuff.Mode.DST
4.PorterDuff.Mode.SRC_OVER
5.PorterDuff.Mode.DST_OVER
6.PorterDuff.Mode.SRC_IN
7.PorterDuff.Mode.DST_IN
8.PorterDuff.Mode.SRC_OUT
9.PorterDuff.Mode.DST_OUT
10.PorterDuff.Mode.SRC_ATOP
11.PorterDuff.Mode.DST_ATOP
12.PorterDuff.Mode.XOR
13.PorterDuff.Mode.DARKEN
14.PorterDuff.Mode.LIGHTEN
15.PorterDuff.Mode.MULTIPLY
16.PorterDuff.Mode.SCREEN

Paint p = new Paint();
p.setAntiAlias(true);
p.setAlpha(0x80);/设置颜色透明度为十六进制80(半透明),0x00全透明0xFF不透明
c.drawCircle(x/2, y/2, x/2, p);//在位图矩阵区域内画一个相切的圆
p.setAlpha(0x30);
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));//用指定的PorterDuff模型创建xformode


   Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_4444);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
paint.setAntiAlias(true);//在绘制一个新的Paint对象时,可以通过传递给它一些标记来影响它被渲染的方式。ANTI_ALIAS_FLAG可以保证在绘制斜线的时候使用抗锯齿效果来平滑该斜线的外观。要创建更加平滑的文本效果,可以应用SUBPIXEL_TEXT_FLAG,它将会应用子像素抗锯齿效果。也可以手工地使用setSubpixelText和setAntiAlias方法来设置这些标记
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
//paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
//MULTIPLY 多层阴影
paint.setXfermode(new PorterDuffXfermode(mode));
canvas.drawBitmap(bitmap, rect, rect, paint);

after

【转】Android图像处理之Bitmap类

via http://www.ucmdn.com/article-2091-1.html

Bitmap是android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。

 

一、Bitmap的生成

1.1 BitmapFactory decode出Bitmap

Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。

Android图像处理之Bitmap类

图一、BitmapFactory主要方法及Options选项

 

利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap。

 

1.2 decode时的选项

在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options

利用Options的下列属性,可以指定decode的选项:

  • inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。
  • inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
  • inSampleSize 设置decode时的缩放比例。

 

利用Options的这些值就可以高效的得到一幅缩略图。

Android图像处理之Bitmap类

图二、BitmapFactory.decodeFile()

 

先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息[Step#2~4];

利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据[Step#5~8]。

先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。

 

二、利用Bitmap和Matrix实现图像变换

Bitmap可以和Matrix结合实现图像的剪切、旋转、缩放等操作。

Android图像处理之Bitmap类

图三、Bitmap方法

 

用源Bitmap通过变换生成新的Bitmap的方法:

Java”>

1 public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height,
2 Matrix m, boolean filter)
3 public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height)
4 public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,
5 int dstHeight,boolean filter)

 

第一个方法是最终的实现,后两种只是对第一种方法的封装。

第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切;第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。

 

设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。

Android图像处理之Bitmap类

图四、Bitmap实现旋转

 

三、保存图像文件

经过图像变换之后的Bitmap里的数据可以保存到图像压缩文件里(JPG/PNG)。

Android图像处理之Bitmap类

图五、保存Bitmap数据到文件

 

这个操作过程中,Bitmap.compress()方法的参数format可设置JPEG或PNG格式;quality可选择压缩质量;fOut是输出流(OutputStream),这里的FileOutputStream是OutputStream的一个子类。

 

总结一下,本文介绍Bitmap的使用方法用Bitmap实现图像文件的读取和写入,并用Bitmap实现图像的剪切、旋转和缩放变换。

获取Bitmap对象

1、使用常用的静态方法获取Bitmap对象
static Bitmap     createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
//Returns an immutable bitmap from subset of the source bitmap, transformed by the optional matrix.
static Bitmap     createBitmap(int width, int height, Bitmap.Config config)
//Returns a mutable bitmap with the specified width and height.
static Bitmap     createBitmap(Bitmap source, int x, int y, int width, int height)
//Returns an immutable bitmap from the specified subset of the source bitmap.
static Bitmap     createBitmap(int[] colors, int offset, int stride, int width, int height, Bitmap.Config config)
//Returns a immutable bitmap with the specified width and height, with each pixel value set to the corresponding value in the colors array.
static Bitmap     createBitmap(Bitmap src)
//Returns an immutable bitmap from the source bitmap.
static Bitmap     createBitmap(int[] colors, int width, int height, Bitmap.Config config)
//Returns a immutable bitmap with the specified width and height, with each pixel value set to the corresponding value in the colors array.
static Bitmap     createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)
//Creates a new bitmap, scaled from an existing bitmap, when possible.  

2、使用BitmapFactory工厂类获取Bitmap对象
BitmapFactory工厂类是一个工具类,包含了很多种获取Bitmap的方法。
1. Decode an immutable bitmap from the specified byte array.
static Bitmap   decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)  //  解析byte[]
static Bitmap decodeByteArray(byte[] data, int offset, int length)
2.Decode a file path into a bitmap.
static Bitmap   decodeFile(String pathName)
static Bitmap   decodeFile(String pathName, BitmapFactory.Options opts)
3. Decode a bitmap from the file descriptor.
static Bitmap decodeFileDescriptor(FileDescriptor fd)
static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, BitmapFactory.Options opts)
4. Synonym for opening the given resource
static Bitmap decodeResource(Resources res, int id, BitmapFactory.Options opts)
//Synonym for opening the given resource and calling decodeResourceStream(Resources, TypedValue, InputStream, Rect, BitmapFactory.Options).
static Bitmap decodeResource(Resources res, int id)
//Synonym for decodeResource(Resources, int, android.graphics.BitmapFactory.Options) will null Options.
5. Decode a new Bitmap from an InputStream.
static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, BitmapFactory.Options opts)
static Bitmap decodeStream(InputStream is)
static Bitmap decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts)

3、使用BitmapDrawable获取Bitmap对象,BitmapDrawable继承于Drawable
//方法一
Resources res;
InputStream is=res.openRawResource(R.drawable.pic);
BitmapDrawable bitmapDrawable=new BitmapDrawable(is);
Bitmap bmp=bitmapDrawable.getBitmap();
//方法二
Resources res;
BitmapDrawable bitmapDrawable=(BitmapDrawable)res.getDrawable(R.drawable.pic);
Bitmap bmp=bitmapDrawable.getBitmap();
//方法三
ImageView image;
image.setImageBitmap(BitmapFactory.decodeStream(~~~~));
BitmapDrawable bitmapDrawable=(BitmapDrawable)image.getDrawable();
Bitmap bmp=bitmapDrawable.getBitmap();

当在Android工程的Drawable文件夹中导入图像文件(GIF、PNG、JPG,BMP)时,Android SDK会为这个文件生成一个Drawable对象。可以通过R.drawable的方式访问这个对象。一般是调用Resource.getDrawable(int id)的方式直接获取。
4. Bitmap与Drawable的转换关系

  • Bitmap转为Drawable:BitmapDrawable bitmapDrawable= new BitmapDrawable(bitmap) /BtimapDrawable是Drawable的子类,最终直接使用bitmapDrawable即可。
  • Drawable转为Bitmap:

5.Bitmap与byte[]的转换关系

  • Bitmap2Bytes:

public byte[] Bitmap2Bytes(Bitmap bmp) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//public boolean compress (Bitmap.CompressFormat format, int quality, OutputStream stream)
bmp.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream );
return byteArrayOutputStream.toByteArray();
}

  • Bytes2Bitmap:

static Bitmap decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)

via http://blog.csdn.net/conowen/article/details/7832789

Get Bitmap from an Uri

targetUri = Intentdata.getData();
try { bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri)); targetImage.setImageBitmap(bitmap); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } 
Uri getData()

Retrieve data this intent is operating on.
final static Bitmap getBitmap(ContentResolver cr, Uri url)

Retrieves an image for the given url as a Bitmap.
 

Bundle extras = Intentdata.getExtras();

Bitmap bmp = (Bitmap) extras.get(“data”); //

Object get(String key)

Returns the entry with the given key as an object.

Google – Loading Large Bitmaps Efficiently

Photo Location:

1.  the uri returned from build-in Gallery app is in the format of “content://media/external/images/…”.

Uri targetUri = data.getData();
textTargetUri.setText(targetUri.toString());
static Uri getContentUri(String volumeName)

Get the content:// style URI for the image media table on the given volume.
2. convert it to the real path format (eg. /mnt/sdcard/dropbox/Eric/....png), the following function can be used.
public String getRealPathFromURI(Uri contentUri) {
       String[] proj = { MediaStore.Images.Media.DATA };
       Cursor cursor = managedQuery(contentUri, proj, null, null, null);
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
       cursor.moveToFirst();
       return cursor.getString(column_index);
   }
final Cursor managedQuery(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

This method is deprecated. Use CursorLoader instead.

 Bitmap orientation:

Exif orientation

For convenience, here is what the letter F would look like if it were tagged correctly and displayed by a program that ignores the orientation tag (thus showing the stored image):
1        2       3      4         5            6           7          8

888888  888888      88  88      8888888888  88                  88  8888888888
88          88      88  88      88  88      88  88          88  88      88  88
8888      8888    8888  8888    88          8888888888  8888888888          88
88          88      88  88
88          88  888888  888888

ExifInterface exif = new ExifInterface(filename);
orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);//grab the orientation of the image,the most important values are 3, 6 and 8. If the orientation is 6, for example, you can rotate the image like this:

Matrix matrix = new Matrix();
matrix.postRotate(90);
rotatedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), matrix, true);
生活在西班牙

自己动手丰衣足食

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

John's Weblog

Just another WordPress.com weblog