1. 将图片变为圆角

2. 获取缩略图图片

3. LOMO特效

4. 旧时光特效

5. 暖意特效

6. 根据饱和度、色相、亮度调整图片

7. 添加图片外边框

8. 添加内边框

9. 创建一个缩放的图片

/**
* 图片工具类
*
* @author rendongwei
*
*/
public class PhotoUtil {
/**
* 将图片变为圆角
*
* @param bitmap
* 原Bitmap图片
* @param pixels
* 图片圆角的弧度(单位:像素(px))
* @return 带有圆角的图片(Bitmap 类型)
*/
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {

Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
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);
final float roundPx = pixels;

paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);

return output;
}

public static boolean saveToSDCard(Bitmap bitmap) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return false;
}
FileOutputStream fileOutputStream = null;
File file = new File("/sdcard/KaiXin/Download/");
if (!file.exists()) {
file.mkdirs();
}
String fileName = UUID.randomUUID().toString() + ".jpg";
String filePath = "/sdcard/KaiXin/Download/" + fileName;
File f = new File(filePath);
if (!f.exists()) {
try {
f.createNewFile();
fileOutputStream = new FileOutputStream(filePath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
} catch (IOException e) {
return false;
} finally {
try {
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
return false;
}
}
}
return true;
}

/**
* 保存图片到本地(JPG)
*
* @param bm
* 保存的图片
* @return 图片路径
*/
public static String saveToLocal(Bitmap bm) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return null;
}
FileOutputStream fileOutputStream = null;
File file = new File("/sdcard/KaiXin/Images/");
if (!file.exists()) {
file.mkdirs();
}
String fileName = UUID.randomUUID().toString() + ".jpg";
String filePath = "/sdcard/KaiXin/Images/" + fileName;
File f = new File(filePath);
if (!f.exists()) {
try {
f.createNewFile();
fileOutputStream = new FileOutputStream(filePath);
bm.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
} catch (IOException e) {
return null;
} finally {
try {
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
return null;
}
}
}
return filePath;
}

/**
* 保存图片到本地(PNG)
*
* @param bm
* 保存的图片
* @return 图片路径
*/
public static String saveToLocalPNG(Bitmap bm) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return null;
}
FileOutputStream fileOutputStream = null;
File file = new File("/sdcard/KaiXin/Images/");
if (!file.exists()) {
file.mkdirs();
}
String fileName = UUID.randomUUID().toString() + ".png";
String filePath = "/sdcard/KaiXin/Images/" + fileName;
File f = new File(filePath);
if (!f.exists()) {
try {
f.createNewFile();
fileOutputStream = new FileOutputStream(filePath);
bm.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
} catch (IOException e) {
return null;
} finally {
try {
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
return null;
}
}
}
return filePath;
}

/**
* 获取缩略图图片
*
* @param imagePath
* 图片的路径
* @param width
* 图片的宽度
* @param height
* 图片的高度
* @return 缩略图图片
*/
public static Bitmap getImageThumbnail(String imagePath, int width, int height) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高,注意此处的bitmap为null
bitmap = BitmapFactory.decodeFile(imagePath, options);
options.inJustDecodeBounds = false; // 设为 false
// 计算缩放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight) {
be = beWidth;
} else {
be = beHeight;
}
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
// 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
bitmap = BitmapFactory.decodeFile(imagePath, options);
// 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
return bitmap;
}

/**
* LOMO特效
*
* @param bitmap
* 原图片
* @return LOMO特效图片
*/
public static Bitmap lomoFilter(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int dst[] = new int[width * height];
bitmap.getPixels(dst, 0, width, 0, 0, width, height);

int ratio = width > height ? height * 32768 / width : width * 32768 / height;
int cx = width >> 1;
int cy = height >> 1;
int max = cx * cx + cy * cy;
int min = (int) (max * (1 - 0.8f));
int diff = max - min;

int ri, gi, bi;
int dx, dy, distSq, v;

int R, G, B;

int value;
int pos, pixColor;
int newR, newG, newB;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
pos = y * width + x;
pixColor = dst[pos];
R = Color.red(pixColor);
G = Color.green(pixColor);
B = Color.blue(pixColor);

value = R < 128 ? R : 256 - R;
newR = (value * value * value) / 64 / 256;
newR = (R < 128 ? newR : 255 - newR);

value = G < 128 ? G : 256 - G;
newG = (value * value) / 128;
newG = (G < 128 ? newG : 255 - newG);

newB = B / 2 + 0x25;

// ==========边缘黑暗==============//
dx = cx - x;
dy = cy - y;
if (width > height)
dx = (dx * ratio) >> 15;
else
dy = (dy * ratio) >> 15;

distSq = dx * dx + dy * dy;
if (distSq > min) {
v = ((max - distSq) << 8) / diff;
v *= v;

ri = newR * v >> 16;
gi = newG * v >> 16;
bi = newB * v >> 16;

newR = ri > 255 ? 255 : (ri < 0 ? 0 : ri);
newG = gi > 255 ? 255 : (gi < 0 ? 0 : gi);
newB = bi > 255 ? 255 : (bi < 0 ? 0 : bi);
}
// ==========边缘黑暗end==============//

dst[pos] = Color.rgb(newR, newG, newB);
}
}

Bitmap acrossFlushBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
acrossFlushBitmap.setPixels(dst, 0, width, 0, 0, width, height);
return acrossFlushBitmap;
}

/**
* 旧时光特效
*
* @param bmp
* 原图片
* @return 旧时光特效图片
*/
public static Bitmap oldTimeFilter(Bitmap bmp) {
int width = bmp.getWidth();
int height = bmp.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
int pixColor = 0;
int pixR = 0;
int pixG = 0;
int pixB = 0;
int newR = 0;
int newG = 0;
int newB = 0;
int[] pixels = new int[width * height];
bmp.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < height; i++) {
for (int k = 0; k < width; k++) {
pixColor = pixels[width * i + k];
pixR = Color.red(pixColor);
pixG = Color.green(pixColor);
pixB = Color.blue(pixColor);
newR = (int) (0.393 * pixR + 0.769 * pixG + 0.189 * pixB);
newG = (int) (0.349 * pixR + 0.686 * pixG + 0.168 * pixB);
newB = (int) (0.272 * pixR + 0.534 * pixG + 0.131 * pixB);
int newColor = Color.argb(255, newR > 255 ? 255 : newR, newG > 255 ? 255 : newG, newB > 255 ? 255
: newB);
pixels[width * i + k] = newColor;
}
}

bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}

/**
* 暖意特效
*
* @param bmp
* 原图片
* @param centerX
* 光源横坐标
* @param centerY
* 光源纵坐标
* @return 暖意特效图片
*/
public static Bitmap warmthFilter(Bitmap bmp, int centerX, int centerY) {
final int width = bmp.getWidth();
final int height = bmp.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);

int pixR = 0;
int pixG = 0;
int pixB = 0;

int pixColor = 0;

int newR = 0;
int newG = 0;
int newB = 0;
int radius = Math.min(centerX, centerY);

final float strength = 150F; // 光照强度 100~150
int[] pixels = new int[width * height];
bmp.getPixels(pixels, 0, width, 0, 0, width, height);
int pos = 0;
for (int i = 1, length = height - 1; i < length; i++) {
for (int k = 1, len = width - 1; k < len; k++) {
pos = i * width + k;
pixColor = pixels[pos];

pixR = Color.red(pixColor);
pixG = Color.green(pixColor);
pixB = Color.blue(pixColor);

newR = pixR;
newG = pixG;
newB = pixB;

// 计算当前点到光照中心的距离,平面座标系中求两点之间的距离
int distance = (int) (Math.pow((centerY - i), 2) + Math.pow(centerX - k, 2));
if (distance < radius * radius) {
// 按照距离大小计算增加的光照值
int result = (int) (strength * (1.0 - Math.sqrt(distance) / radius));
newR = pixR + result;
newG = pixG + result;
newB = pixB + result;
}

newR = Math.min(255, Math.max(0, newR));
newG = Math.min(255, Math.max(0, newG));
newB = Math.min(255, Math.max(0, newB));

pixels[pos] = Color.argb(255, newR, newG, newB);
}
}

bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}

/**
* 根据饱和度、色相、亮度调整图片
*
* @param bm
* 原图片
* @param saturation
* 饱和度
* @param hue
* 色相
* @param lum
* 亮度
* @return 处理后的图片
*/
public static Bitmap handleImage(Bitmap bm, int saturation, int hue, int lum) {
Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
Paint paint = new Paint();
paint.setAntiAlias(true);
ColorMatrix mLightnessMatrix = new ColorMatrix();
ColorMatrix mSaturationMatrix = new ColorMatrix();
ColorMatrix mHueMatrix = new ColorMatrix();
ColorMatrix mAllMatrix = new ColorMatrix();
float mSaturationValue = saturation * 1.0F / 127;
float mHueValue = hue * 1.0F / 127;
float mLumValue = (lum - 127) * 1.0F / 127 * 180;
mHueMatrix.reset();
mHueMatrix.setScale(mHueValue, mHueValue, mHueValue, 1);

mSaturationMatrix.reset();
mSaturationMatrix.setSaturation(mSaturationValue);
mLightnessMatrix.reset();

mLightnessMatrix.setRotate(0, mLumValue);
mLightnessMatrix.setRotate(1, mLumValue);
mLightnessMatrix.setRotate(2, mLumValue);

mAllMatrix.reset();
mAllMatrix.postConcat(mHueMatrix);
mAllMatrix.postConcat(mSaturationMatrix);
mAllMatrix.postConcat(mLightnessMatrix);

paint.setColorFilter(new ColorMatrixColorFilter(mAllMatrix));
canvas.drawBitmap(bm, 0, 0, paint);
return bmp;
}

/**
* 添加图片外边框
*
* @param context
* 上下文
* @param bm
* 原图片
* @param frameName
* 边框名称
* @return 带有边框的图片
*/
public static Bitmap combinateFrame(Context context, Bitmap bm, String frameName) {
// 原图片的宽高
int imageWidth = bm.getWidth();
int imageHeight = bm.getHeight();

// 边框
Bitmap leftUp = decodeBitmap(context, frameName, 0);
Bitmap leftDown = decodeBitmap(context, frameName, 2);
Bitmap rightDown = decodeBitmap(context, frameName, 4);
Bitmap rightUp = decodeBitmap(context, frameName, 6);
Bitmap top = decodeBitmap(context, frameName, 7);
Bitmap down = decodeBitmap(context, frameName, 3);
Bitmap left = decodeBitmap(context, frameName, 1);
Bitmap right = decodeBitmap(context, frameName, 5);

Bitmap newBitmap = null;
Canvas canvas = null;

// 判断大小图片的宽高
int judgeWidth = 0;
int judgeHeight = 0;
if ("frame7".equals(frameName)) {
judgeWidth = leftUp.getWidth() + rightUp.getWidth() + top.getWidth() * 5;
judgeHeight = leftUp.getHeight() + leftDown.getHeight() + left.getHeight() * 5;
} else if ("frame10".equals(frameName)) {
judgeWidth = leftUp.getWidth() + rightUp.getWidth() + top.getWidth() * 5;
judgeHeight = leftUp.getHeight() + leftDown.getHeight() + left.getHeight() * 10;
} else {
judgeWidth = leftUp.getWidth() + rightUp.getWidth() + top.getWidth();
judgeHeight = leftUp.getHeight() + leftDown.getHeight() + left.getHeight();
}
// 内边框
if (imageWidth > judgeWidth && imageHeight > judgeHeight) {
// 重新定义一个bitmap
newBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Config.ARGB_8888);
canvas = new Canvas(newBitmap);
Paint paint = new Paint();
// 画原图
canvas.drawBitmap(bm, 0, 0, paint);
// 上空余宽度
int topWidth = imageWidth - leftUp.getWidth() - rightUp.getWidth();
// 上空余填充个数
int topCount = (int) Math.ceil(topWidth * 1.0f / top.getWidth());
for (int i = 0; i < topCount; i++) {
canvas.drawBitmap(top, leftUp.getWidth() + top.getWidth() * i, 0, paint);
}
// 下空余宽度
int downWidth = imageWidth - leftDown.getWidth() - rightDown.getWidth();
// 下空余填充个数
int downCount = (int) Math.ceil(downWidth * 1.0f / down.getWidth());
for (int i = 0; i < downCount; i++) {
canvas.drawBitmap(down, leftDown.getWidth() + down.getWidth() * i, imageHeight - down.getHeight(),
paint);
}
// 左空余高度
int leftHeight = imageHeight - leftUp.getHeight() - leftDown.getHeight();
// 左空余填充个数
int leftCount = (int) Math.ceil(leftHeight * 1.0f / left.getHeight());
for (int i = 0; i < leftCount; i++) {
canvas.drawBitmap(left, 0, leftUp.getHeight() + left.getHeight() * i, paint);
}
// 右空余高度
int rightHeight = imageHeight - rightUp.getHeight() - rightDown.getHeight();
// 右空余填充个数
int rightCount = (int) Math.ceil(rightHeight * 1.0f / right.getHeight());
for (int i = 0; i < rightCount; i++) {
canvas.drawBitmap(right, imageWidth - right.getWidth(), rightUp.getHeight() + right.getHeight() * i,
paint);
}
// 画左上角
canvas.drawBitmap(leftUp, 0, 0, paint);
// 画左下角
canvas.drawBitmap(leftDown, 0, imageHeight - leftDown.getHeight(), paint);
// 画右下角
canvas.drawBitmap(rightDown, imageWidth - rightDown.getWidth(), imageHeight - rightDown.getHeight(), paint);
// 画右上角
canvas.drawBitmap(rightUp, imageWidth - rightUp.getWidth(), 0, paint);

} else {
if ("frame7".equals(frameName)) {
imageWidth = leftUp.getWidth() + top.getWidth() * 5 + rightUp.getWidth();
imageHeight = leftUp.getHeight() + left.getHeight() * 5 + leftDown.getHeight();
} else if ("frame10".equals(frameName)) {
imageWidth = leftUp.getWidth() + top.getWidth() * 5 + rightUp.getWidth();
imageHeight = leftUp.getHeight() + left.getHeight() * 10 + leftDown.getHeight();
} else {
imageWidth = leftUp.getWidth() + top.getWidth() + rightUp.getWidth();
imageHeight = leftUp.getHeight() + left.getHeight() + leftDown.getHeight();
}
newBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Config.ARGB_8888);
canvas = new Canvas(newBitmap);
Paint paint = new Paint();
int newImageWidth = imageWidth - left.getWidth() - right.getWidth() + 5;
int newImageHeight = imageHeight - top.getHeight() - down.getHeight() + 5;
bm = Bitmap.createScaledBitmap(bm, newImageWidth, newImageHeight, true);
canvas.drawBitmap(bm, left.getWidth(), top.getHeight(), paint);
if ("frame7".equals(frameName)) {

for (int i = 0; i < 5; i++) {
canvas.drawBitmap(top, leftUp.getWidth() + top.getWidth() * i, 0, paint);
}

for (int i = 0; i < 5; i++) {
canvas.drawBitmap(left, 0, leftUp.getHeight() + left.getHeight() * i, paint);
}

for (int i = 0; i < 5; i++) {
canvas.drawBitmap(right, imageWidth - right.getWidth(),
rightUp.getHeight() + right.getHeight() * i, paint);
}

for (int i = 0; i < 5; i++) {
canvas.drawBitmap(down, leftDown.getWidth() + down.getWidth() * i, imageHeight - down.getHeight(),
paint);
}
canvas.drawBitmap(leftUp, 0, 0, paint);
canvas.drawBitmap(rightUp, leftUp.getWidth() + top.getWidth() * 5, 0, paint);
canvas.drawBitmap(leftDown, 0, leftUp.getHeight() + left.getHeight() * 5, paint);
canvas.drawBitmap(rightDown, imageWidth - rightDown.getWidth(), rightUp.getHeight() + right.getHeight()
* 5, paint);

} else if ("frame10".equals(frameName)) {
for (int i = 0; i < 5; i++) {
canvas.drawBitmap(top, leftUp.getWidth() + top.getWidth() * i, 0, paint);
}

for (int i = 0; i < 10; i++) {
canvas.drawBitmap(left, 0, leftUp.getHeight() + left.getHeight() * i, paint);
}

for (int i = 0; i < 10; i++) {
canvas.drawBitmap(right, imageWidth - right.getWidth(),
rightUp.getHeight() + right.getHeight() * i, paint);
}

for (int i = 0; i < 5; i++) {
canvas.drawBitmap(down, leftDown.getWidth() + down.getWidth() * i, imageHeight - down.getHeight(),
paint);
}
canvas.drawBitmap(leftUp, 0, 0, paint);
canvas.drawBitmap(rightUp, leftUp.getWidth() + top.getWidth() * 5, 0, paint);
canvas.drawBitmap(leftDown, 0, leftUp.getHeight() + left.getHeight() * 10, paint);
canvas.drawBitmap(rightDown, imageWidth - rightDown.getWidth(), rightUp.getHeight() + right.getHeight()
* 10, paint);
} else {
canvas.drawBitmap(leftUp, 0, 0, paint);
canvas.drawBitmap(top, leftUp.getWidth(), 0, paint);
canvas.drawBitmap(rightUp, leftUp.getWidth() + top.getWidth(), 0, paint);
canvas.drawBitmap(left, 0, leftUp.getHeight(), paint);
canvas.drawBitmap(leftDown, 0, leftUp.getHeight() + left.getHeight(), paint);
canvas.drawBitmap(right, imageWidth - right.getWidth(), rightUp.getHeight(), paint);
canvas.drawBitmap(rightDown, imageWidth - rightDown.getWidth(),
rightUp.getHeight() + right.getHeight(), paint);
canvas.drawBitmap(down, leftDown.getWidth(), imageHeight - down.getHeight(), paint);
}
}
// 回收
leftUp.recycle();
leftUp = null;
leftDown.recycle();
leftDown = null;
rightDown.recycle();
rightDown = null;
rightUp.recycle();
rightUp = null;
top.recycle();
top = null;
down.recycle();
down = null;
left.recycle();
left = null;
right.recycle();
right = null;
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return newBitmap;
}

/**
* 获取边框图片
*
* @param context
* 上下文
* @param frameName
* 边框名称
* @param position
* 边框的类型
* @return 边框图片
*/
private static Bitmap decodeBitmap(Context context, String frameName, int position) {
try {
switch (position) {
case 0:
return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/leftup.png"));
case 1:
return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/left.png"));
case 2:
return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/leftdown.png"));
case 3:
return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/down.png"));
case 4:
return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/rightdown.png"));
case 5:
return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/right.png"));
case 6:
return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/rightup.png"));
case 7:
return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/up.png"));
default:
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

/**
* 添加内边框
*
* @param bm
* 原图片
* @param frame
* 内边框图片
* @return 带有边框的图片
*/
public static Bitmap addBigFrame(Bitmap bm, Bitmap frame) {
Bitmap newBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(newBitmap);
Paint paint = new Paint();
canvas.drawBitmap(bm, 0, 0, paint);
frame = Bitmap.createScaledBitmap(frame, bm.getWidth(), bm.getHeight(), true);
canvas.drawBitmap(frame, 0, 0, paint);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return newBitmap;

}

/**
* 创建一个缩放的图片
*
* @param path
* 图片地址
* @param w
* 图片宽度
* @param h
* 图片高度
* @return 缩放后的图片
*/
public static Bitmap createBitmap(String path, int w, int h) {
try {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
// 这里是整个方法的关键,inJustDecodeBounds设为true时将不为图片分配内存。
BitmapFactory.decodeFile(path, opts);
int srcWidth = opts.outWidth;// 获取图片的原始宽度
int srcHeight = opts.outHeight;// 获取图片原始高度
int destWidth = 0;
int destHeight = 0;
// 缩放的比例
double ratio = 0.0;
if (srcWidth < w || srcHeight < h) {
ratio = 0.0;
destWidth = srcWidth;
destHeight = srcHeight;
} else if (srcWidth > srcHeight) {// 按比例计算缩放后的图片大小,maxLength是长或宽允许的最大长度
ratio = (double) srcWidth / w;
destWidth = w;
destHeight = (int) (srcHeight / ratio);
} else {
ratio = (double) srcHeight / h;
destHeight = h;
destWidth = (int) (srcWidth / ratio);
}
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 缩放的比例,缩放是很难按准备的比例进行缩放的,目前我只发现只能通过inSampleSize来进行缩放,其值表明缩放的倍数,SDK中建议其值是2的指数值
newOpts.inSampleSize = (int) ratio + 1;
// inJustDecodeBounds设为false表示把图片读进内存中
newOpts.inJustDecodeBounds = false;
// 设置大小,这个一般是不准确的,是以inSampleSize的为准,但是如果不设置却不能缩放
newOpts.outHeight = destHeight;
newOpts.outWidth = destWidth;
// 获取缩放后图片
return BitmapFactory.decodeFile(path, newOpts);
} catch (Exception e) {
// TODO: handle exception
return null;
}
}

public static Bitmap createBitmap2(Context context, int id, int w, int h) {
try {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
// 这里是整个方法的关键,inJustDecodeBounds设为true时将不为图片分配内存。
BitmapFactory.decodeResource(context.getResources(), id, opts);
int srcWidth = opts.outWidth;// 获取图片的原始宽度
int srcHeight = opts.outHeight;// 获取图片原始高度
int destWidth = 0;
int destHeight = 0;
// 缩放的比例
double ratio = 0.0;
if (srcWidth < w || srcHeight < h) {
ratio = 0.0;
destWidth = srcWidth;
destHeight = srcHeight;
} else if (srcWidth > srcHeight) {// 按比例计算缩放后的图片大小,maxLength是长或宽允许的最大长度
ratio = (double) srcWidth / w;
destWidth = w;
destHeight = (int) (srcHeight / ratio);
} else {
ratio = (double) srcHeight / h;
destHeight = h;
destWidth = (int) (srcWidth / ratio);
}
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 缩放的比例,缩放是很难按准备的比例进行缩放的,目前我只发现只能通过inSampleSize来进行缩放,其值表明缩放的倍数,SDK中建议其值是2的指数值
newOpts.inSampleSize = (int) ratio + 1;
// inJustDecodeBounds设为false表示把图片读进内存中
newOpts.inJustDecodeBounds = false;
// 设置大小,这个一般是不准确的,是以inSampleSize的为准,但是如果不设置却不能缩放
newOpts.outHeight = destHeight;
newOpts.outWidth = destWidth;
// 获取缩放后图片
// return BitmapFactory.decodeFile(path, newOpts);
return BitmapFactory.decodeResource(context.getResources(), id, newOpts);
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
}

Android之多种Bitmap效果(4)的更多相关文章

  1. Android之多种Bitmap效果

    1. 将图片变为圆角 2. 获取缩略图图片 3. LOMO特效 4. 旧时光特效 5. 暖意特效 6. 根据饱和度.色相.亮度调整图片 7. 添加图片外边框 8. 添加内边框 9. 创建一个缩放的图片 ...

  2. Android开发之ListView添加多种布局效果演示

    在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...

  3. 兼容Android的水波纹效果

    Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...

  4. Android下利用Bitmap切割图片

    在自己自定义的一个组件中由于需要用图片显示数字编号,而当前图片就只有一张,上面有0-9是个数字,于是不得不考虑将其中一个个的数字切割下来,需要显示什么数字,只需要组合一下就好了. 下面是程序的关键代码 ...

  5. 【转】(转)【Android】Paint的效果研究

    转自:http://wpf814533631.iteye.com/blog/1847661 (转)[Android]Paint的效果研究 博客分类: android   在Paint中有很多的属性可以 ...

  6. 实用CSS3的transform实现多种动画效果

    查看效果:http://keleyi.com/a/bjad/b6x9q8gs.htm 以下是代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. ...

  7. 解决Android Graphical Layout 界面效果不显示

    解决Android Graphical Layout 界面效果不显示 qq463431476

  8. 浅谈Android下的Bitmap之大Bitmap加载

    引言 我们常常提到的“Android程序优化”,通常指的是性能和内存的优化,即:更快的响应速度,更低的内存占用.Android程序的性能和内存问题,大部分都和图片紧密相关,而图片的加载在很多情况下很用 ...

  9. android 的闪屏效果

    android的闪屏效果,就是我们刚开始启动应用的时候弹出的界面或者动画,过2秒之后自动的跳转到主界面. 其实,实现这个效果很简单,使用Handler对象的postDelayed方法就可以实现.在这个 ...

随机推荐

  1. 黑客常用WinAPI函数整理

    之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程.为了使读者对黑客常用的Windows API有个更全面的了解以及方便日后使用API方法的查询,特 ...

  2. 第十七周 Leetcode 403. Frog Jump(HARD) 线性dp

    leetcode403 我们维护青蛙从某个石头上可以跳那些长度的距离即可 用平衡树维护. 总的复杂度O(n^2logn) class Solution { public: bool canCross( ...

  3. JSP+MySQL实例

    转自:https://www.yiibai.com/jsp/jsp_mysql.html 在本章中,我们将讨论如何使用JSP访问数据库(这里以MySQL数据库为例).并假设您对JDBC应用程序的工作方 ...

  4. DIV居中显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. asp.net mvc4 不支持EF6

    参考文章:http://www.cnblogs.com/zeusro/p/3403771.html http://q.cnblogs.com/q/40926/ 解决方法是 1.把EF6删除改用EF5. ...

  6. 第一篇(eclipse中的单词)

    launcher 启动栏,启动器 select a directory as workspace. 选择一个目录作为工作区 directory 目录 workspace 工作空间,工作区 Eclips ...

  7. 菜鸡CodeFoces打卡单

    2017.12.13 1:05 签到3题 Educational Codeforces Round 34 (Rated for Div. 2) 补题:

  8. Kruskal HDOJ 4313 Matrix

    题目传送门 题意:如何花最小的代价使得一棵树划分开且不含同类节点 分析:当一条边连接的左右集合同类点小于等于1,那么不用删除,将两个集合合并,要求最小代价,那么贪心思想将权值降序排序,删除后剩下的就是 ...

  9. 题解报告:hdu 1257 最少拦截系统(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是 ...

  10. asp.net core连接sqlserver

    开发环境:win7,vs2017,sqlserver2014 vs上建立一个asp.net core web项目和一个.net core的类库项目DBA 简单起见,在DBA项目中就一个类SqlServ ...