我可以在gridview中屏蔽图像,但问题是如何在屏蔽中剪切或裁剪图像的蒙版内容。 帮助我一些想法和一些演示..
public void makeMaskImage(ImageView mImageView, Bitmap mBitmap,
int MASK_IMAGEVIEW, int IMAGEVIEW_THUMB_BACKGROUND) {
try {
Bitmap mask = BitmapFactory.decodeResource(mContext.getResources(),MASK_IMAGEVIEW);
Bitmap result = Bitmap.createBitmap(mask.getWidth(),
mask.getHeight(), Config.ARGB_8888);
Canvas mCanvas = new Canvas(result);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
if (mBitmap == null) {
mBitmap = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.no_image_friend);
mImageView.setImageBitmap(mBitmap);
return;
}
mCanvas.drawBitmap(mBitmap, 0, 0, null);
mCanvas.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);
try {
mImageView .setImageBitmap(Bitmap_process(getImageBuffer(result)));
} catch (IOException e) {
e.printStackTrace();
}
mImageView.setScaleType(ScaleType.CENTER);
mImageView.setBackgroundResource(IMAGEVIEW_THUMB_BACKGROUND);
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
您好以下可能是一些帮助
需要合适的图片
final long startTime = SystemClock.uptimeMillis();
// Part 1: Decode image
Bitmap unscaledBitmap = ScalingUtilities.decodeResource(getResources(), mSourceId,
mDstWidth, mDstHeight, ScalingLogic.FIT);
// Part 2: Scale image
Bitmap scaledBitmap = ScalingUtilities.createScaledBitmap(unscaledBitmap, mDstWidth,
mDstHeight, ScalingLogic.FIT);
unscaledBitmap.recycle();
// Calculate memory usage and performance statistics
final int memUsageKb = (unscaledBitmap.getRowBytes() * unscaledBitmap.getHeight()) / 1024;
final long stopTime = SystemClock.uptimeMillis();
// Publish results
mResultView.setText("Time taken: " + (stopTime - startTime)
+ " ms. Memory used for scaling: " + memUsageKb + " kb.");
mImageView.setImageBitmap(scaledBitmap);
接下来如何裁剪图像
final long startTime = SystemClock.uptimeMillis();
// Part 1: Decode image
Bitmap unscaledBitmap = ScalingUtilities.decodeResource(getResources(), mSourceId,
mDstWidth, mDstHeight, ScalingLogic.CROP);
// Part 2: Scale image
Bitmap scaledBitmap = ScalingUtilities.createScaledBitmap(unscaledBitmap, mDstWidth,
mDstHeight, ScalingLogic.CROP);
unscaledBitmap.recycle();
// Calculate memory usage and performance statistics
final int memUsageKb = (unscaledBitmap.getRowBytes() * unscaledBitmap.getHeight()) / 1024;
final long stopTime = SystemClock.uptimeMillis();
// Publish results
mResultView.setText("Time taken: " + (stopTime - startTime)
+ " ms. Memory used for scaling: " + memUsageKb + " kb.");
mImageView.setImageBitmap(scaledBitmap);
解码资源功能
public static Bitmap decodeResource(Resources res, int resId, int dstWidth, int dstHeight,
ScalingLogic scalingLogic) {
Options options = new Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
options.inJustDecodeBounds = false;
options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth,
dstHeight, scalingLogic);
Bitmap unscaledBitmap = BitmapFactory.decodeResource(res, resId, options);
return unscaledBitmap;
}
calculateSampleSize函数
public static int calculateSampleSize(int srcWidth, int srcHeight, int dstWidth, int dstHeight,
ScalingLogic scalingLogic) {
if (scalingLogic == ScalingLogic.FIT) {
final float srcAspect = (float)srcWidth / (float)srcHeight;
final float dstAspect = (float)dstWidth / (float)dstHeight;
if (srcAspect > dstAspect) {
return srcWidth / dstWidth;
} else {
return srcHeight / dstHeight;
}
} else {
final float srcAspect = (float)srcWidth / (float)srcHeight;
final float dstAspect = (float)dstWidth / (float)dstHeight;
if (srcAspect > dstAspect) {
return srcHeight / dstHeight;
} else {
return srcWidth / dstWidth;
}
}
}
createScaledBitmap函数
public static Bitmap createScaledBitmap(Bitmap unscaledBitmap, int dstWidth, int dstHeight,
ScalingLogic scalingLogic) {
Rect srcRect = calculateSrcRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(),
dstWidth, dstHeight, scalingLogic);
Rect dstRect = calculateDstRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(),
dstWidth, dstHeight, scalingLogic);
Bitmap scaledBitmap = Bitmap.createBitmap(dstRect.width(), dstRect.height(),
Config.ARGB_8888);
Canvas canvas = new Canvas(scaledBitmap);
canvas.drawBitmap(unscaledBitmap, srcRect, dstRect, new Paint(Paint.FILTER_BITMAP_FLAG));
return scaledBitmap;
}
ScalingLogic功能
public static enum ScalingLogic {
CROP, FIT
}
calculateDstRect函数
public static Rect calculateDstRect(int srcWidth, int srcHeight, int dstWidth, int dstHeight,
ScalingLogic scalingLogic) {
if (scalingLogic == ScalingLogic.FIT) {
final float srcAspect = (float)srcWidth / (float)srcHeight;
final float dstAspect = (float)dstWidth / (float)dstHeight;
if (srcAspect > dstAspect) {
return new Rect(0, 0, dstWidth, (int)(dstWidth / srcAspect));
} else {
return new Rect(0, 0, (int)(dstHeight * srcAspect), dstHeight);
}
} else {
return new Rect(0, 0, dstWidth, dstHeight);
}
}