====== Android上图像处理-倒影,圆角,渐变 ======
Android对图片处理的函数应该是很多的,但由于平时对图像处理用到情况不多,要用到时只有不停的Google.
这次要用到的图像效果比较多,有倒影,图片圆角,还有图像渐变,感谢Google,在经过我不懈的搜索后,找到了一些比较有用的做法.
1.在android中2D中实现对图片的倒影:
http://blog.163.com/joe_zhpf@126/blog/static/81331086201032755840878/
2.Android 中实现倒影效果
http://www.blogjava.net/lihao336/archive/2010/04/13/318163.html
3.使用 2D 方法实现倒影特效
http://www.linuxgraphics.cn/android/reflection_effect_2d.html
4.Android 图片透明度处理代码
http://blog.csdn.net/xyz_lmn/archive/2009/12/10/4978982.aspx
5.android图片处理方法
http://gundumw100.iteye.com/blog/849729
我将上面这些代码进行了整理,以适合自己的使用,现在对这些原理都不太了解,需要慢慢的去熟悉:
附目前效果图:
{{:code:android-code:image_reflection.png?|}}
public static Bitmap createReflectionImageWithOrigin(Bitmap originalImage) {
// The gap we want between the reflection and the original image
final int reflectionGap = 4;
// Get you bit map from drawable folder
// Bitmap originalImage = BitmapFactory.decodeResource(getResources(),
// R.drawable.twitter_icon);
int width = originalImage.getWidth();
int height = originalImage.getHeight();
// This will not scale but will flip on the Y axis
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
// Create a Bitmap with the flip matix applied to it.
// We only want the bottom half of the image
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
height / 2, width, height / 2, matrix, false);
// Create a new bitmap with same width but taller to fit reflection
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
(height + height / 2), Config.ARGB_8888);
// Create a new Canvas with the bitmap that's big enough for
// the image plus gap plus reflection
Canvas canvas = new Canvas(bitmapWithReflection);
// Draw in the original image
canvas.drawBitmap(originalImage, 0, 0, null);
// Draw in the gap
Paint deafaultPaint = new Paint();
canvas
.drawRect(0, height, width, height + reflectionGap,
deafaultPaint);
// Draw in the reflection
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
// Create a shader that is a linear gradient that covers the reflection
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,
originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
// Set the paint to use this shader (linear gradient)
paint.setShader(shader);
// Set the Transfer mode to be porter duff and destination in
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// Draw a rectangle using the paint with our linear gradient
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
+ reflectionGap, paint);
return bitmapWithReflection;
}
public static Bitmap createReflectionImageWithNoOrigin(Bitmap originalImage) {
// The gap we want between the reflection and the original image
final int reflectionGap = 4;
// Get you bit map from drawable folder
// Bitmap originalImage = BitmapFactory.decodeResource(getResources(),
// R.drawable.twitter_icon);
int width = originalImage.getWidth();
int height = originalImage.getHeight();
// This will not scale but will flip on the Y axis
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
// Create a Bitmap with the flip matix applied to it.
// We only want the bottom half of the image
int divider = 8;
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height
/ divider * (divider - 1), width, height / divider, matrix,
false);
// Create a new bitmap with same width but taller to fit reflection
Bitmap bitmapWithReflection2 = Bitmap.createBitmap(width, height / 5,
Config.ARGB_8888);
// Create a new Canvas with the bitmap that's big enough for
// the image plus gap plus reflection
Canvas canvas = new Canvas(reflectionImage);
// Draw in the reflection
canvas.drawBitmap(reflectionImage, 0, 0, null);
// Create a shader that is a linear gradient that covers the reflection
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,
originalImage.getHeight(), 0, reflectionImage.getHeight(),
0x70ffffff, 0x00ffffff, TileMode.CLAMP);
// Set the paint to use this shader (linear gradient)
paint.setShader(shader);
// Set the Transfer mode to be porter duff and destination in
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// Draw a rectangle using the paint with our linear gradient
canvas.drawRect(0, height/divider, width, reflectionImage.getHeight(), paint);
return reflectionImage;
}
public static Bitmap setAlpha(Bitmap sourceImg, int number) {
int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()];
sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 0, 0, sourceImg
.getWidth(), sourceImg.getHeight());//Get the ARGB Value of the image
number = number * 255 / 100;
for (int i = 0; i < argb.length; i++) {
//argb = (number << 24) | (argb & 0x00ffffff);// modify the top two bit value
}
sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg
.getHeight(), Config.ARGB_8888);
return sourceImg;
}
/**
* get reflection bitmap of the original bitmap.
*
* @param srcBitmap
* @return
*/
public static Bitmap makeReflectionBitmap(Bitmap originalImage) {
int width = originalImage.getWidth();
int height = originalImage.getHeight();
// This will not scale but will flip on the Y axis
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
// Create a Bitmap with the flip matix applied to it.
// We only want the bottom half of the image
int divider = 8;
Bitmap srcBitmap = Bitmap.createBitmap(originalImage, 0, height
/ divider * (divider - 1), width, height / divider, matrix,
false);
//srcBitmap=originalImage;
int bmpWidth = srcBitmap.getWidth();
int bmpHeight = srcBitmap.getHeight();
int[] pixels = new int[bmpWidth * bmpHeight * 4];
srcBitmap.getPixels(pixels, 0, bmpWidth, 0, 0, bmpWidth, bmpHeight);
// get reversed bitmap
Bitmap reverseBitmap = Bitmap.createBitmap(bmpWidth, bmpHeight,
Bitmap.Config.ARGB_8888);
for (int y = 0; y < bmpHeight; y++) {
reverseBitmap.setPixels(pixels, y * bmpWidth, bmpWidth, 0,
bmpHeight - y - 1, bmpWidth, 1);
}
// get reflection bitmap based on the reversed one
reverseBitmap.getPixels(pixels, 0, bmpWidth, 0, 0, bmpWidth, bmpHeight);
Bitmap reflectionBitmap = Bitmap.createBitmap(bmpWidth, bmpHeight,
Bitmap.Config.ARGB_8888);
int alpha = 0x00000000;
for (int y = 0; y < bmpHeight; y++) {
for (int x = 0; x < bmpWidth; x++) {
int index = y * bmpWidth + x;
int r = (pixels[index] >> 16) & 0xff;
int g = (pixels[index] >> 8) & 0xff;
int b = pixels[index] & 0xff;
pixels[index] = alpha | (r << 16) | (g << 8) | b;
reflectionBitmap.setPixel(x, y, pixels[index]);
}
alpha = alpha + 0x01000000;
}
return reflectionBitmap;
}
/**
* Set the Bitmap alpha
* @param srcBitmap
* @return
*/
public static Bitmap setAlpha(Bitmap srcBitmap){
int bmpWidth = srcBitmap.getWidth();
int bmpHeight = srcBitmap.getHeight();
int[] pixels = new int[bmpWidth * bmpHeight * 4];
srcBitmap.getPixels(pixels, 0, bmpWidth, 0, 0, bmpWidth, bmpHeight);
// get reflection bitmap based on the reversed one
// Bitmap reverseBitmap = Bitmap.createBitmap(bmpWidth, bmpHeight,
// Bitmap.Config.ARGB_8888);
// srcBitmap.getPixels(pixels, 0, bmpWidth, 0, 0, bmpWidth, bmpHeight);
Bitmap reflectionBitmap = Bitmap.createBitmap(bmpWidth, bmpHeight,
Bitmap.Config.ARGB_8888);
//int alpha = 0x88ffffff/10;
int alpha = 0x01000000*100;
Utils.log("bmpWidth="+bmpWidth+",bmpHeight="+bmpHeight);
for (int y = 0; y < bmpHeight; y++) {
Utils.log("alpha="+alpha);
for (int x = 0; x < bmpWidth; x++) {
int index = y * bmpWidth + x;
int r = (pixels[index] >> 16) & 0xff;
int g = (pixels[index] >> 8) & 0xff;
int b = pixels[index] & 0xff;
pixels[index] = alpha | (r << 16) | (g << 8) | b;
reflectionBitmap.setPixel(x, y, pixels[index]);
}
alpha = alpha - 0x01000000*10;
}
return reflectionBitmap;
}
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
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 = 5;
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 Bitmap createFixedBitmapWithImageView(ImageView imageView, Bitmap bitmap) {
float bitmapHeight = bitmap.getHeight();
float bitmapWidth = bitmap.getWidth();
float imageViewWidth = imageView.getWidth();
float imageViewHeight = imageView.getHeight();
float imageViewRate = (float) imageViewWidth / (float) imageViewHeight;
float bitmapRate = (float) bitmapWidth / (float) bitmapHeight;
float newWidth = 0;
float newHeight = 0;
if (bitmapHeight > imageViewHeight && bitmapWidth > imageViewWidth) {
if (bitmapRate > imageViewRate) {
newWidth = imageViewWidth;
newHeight = (imageViewWidth / bitmapWidth) * imageViewHeight;
} else {
newHeight = imageViewHeight;
newWidth = (imageViewHeight / bitmapHeight) * bitmapWidth;
}
} else if (bitmapHeight >= imageViewHeight && bitmapWidth <= imageViewWidth) {
if (bitmapRate > imageViewRate) {
newWidth = imageViewWidth;
newHeight = (imageViewWidth / bitmapWidth) * imageViewHeight;
} else {
newHeight = imageViewHeight;
newWidth = imageViewHeight / bitmapHeight * bitmapWidth;
}
} else if (bitmapHeight < imageViewHeight && bitmapWidth > imageViewWidth) {
if (bitmapRate > imageViewRate) {
newWidth = imageViewWidth;
newHeight = (imageViewWidth / bitmapWidth) * imageViewHeight;
} else {
newHeight = imageViewHeight;
newWidth = (imageViewHeight / bitmapHeight) * bitmapWidth;
}
} else {
if (bitmapRate > imageViewRate) {
newWidth = imageViewWidth;
newHeight = (imageViewWidth) / bitmapWidth * imageViewHeight;
} else {
newHeight = imageViewHeight;
newWidth = (imageViewHeight / bitmapHeight) * bitmapWidth;
}
}
Bitmap resizedBitmap = resizeImage(bitmap, (int) newWidth, (int) newHeight);
return resizedBitmap;
}