Glide第三个过程

ResourceType -> TranscodeType

Posted by candy1126xx on May 17, 2017

缩放

居中剪裁

TransformationUtils.centerCrop():

public static Bitmap centerCrop(Bitmap recycled, Bitmap toCrop, int width, int height) {
    if (toCrop == null) {
        return null;
    } else if (toCrop.getWidth() == width && toCrop.getHeight() == height) {
        return toCrop;
    }
    // From ImageView/Bitmap.createScaledBitmap.
    final float scale;
    float dx = 0, dy = 0;
    Matrix m = new Matrix();
    if (toCrop.getWidth() * height > width * toCrop.getHeight()) {
        scale = (float) height / (float) toCrop.getHeight();
        dx = (width - toCrop.getWidth() * scale) * 0.5f;
    } else {
        scale = (float) width / (float) toCrop.getWidth();
        dy = (height - toCrop.getHeight() * scale) * 0.5f;
    }

    m.setScale(scale, scale);
    m.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
    final Bitmap result;
    if (recycled != null) {
        result = recycled;
    } else {
        result = Bitmap.createBitmap(width, height, getSafeConfig(toCrop));
    }

    TransformationUtils.setAlpha(toCrop, result);

    Canvas canvas = new Canvas(result);
    Paint paint = new Paint(PAINT_FLAGS);
    canvas.drawBitmap(toCrop, m, paint);
    return result;
}

居中缩放

TransformationUtils.fitCenter():

public static Bitmap fitCenter(Bitmap toFit, BitmapPool pool, int width, int height) {
    if (toFit.getWidth() == width && toFit.getHeight() == height) {
        return toFit;
    }
    final float widthPercentage = width / (float) toFit.getWidth();
    final float heightPercentage = height / (float) toFit.getHeight();
    final float minPercentage = Math.min(widthPercentage, heightPercentage);

    final int targetWidth = (int) (minPercentage * toFit.getWidth());
    final int targetHeight = (int) (minPercentage * toFit.getHeight());

    if (toFit.getWidth() == targetWidth && toFit.getHeight() == targetHeight) {
        return toFit;
    }

    Bitmap.Config config = getSafeConfig(toFit);
    Bitmap toReuse = pool.get(targetWidth, targetHeight, config);
    if (toReuse == null) {
        toReuse = Bitmap.createBitmap(targetWidth, targetHeight, config);
    }

    TransformationUtils.setAlpha(toFit, toReuse);

    Canvas canvas = new Canvas(toReuse);
    Matrix matrix = new Matrix();
    matrix.setScale(minPercentage, minPercentage);
    Paint paint = new Paint(PAINT_FLAGS);
    canvas.drawBitmap(toFit, matrix, paint);

    return toReuse;
}

转码

Bitmap转byte[]

public Resource<byte[]> transcode(Resource<Bitmap> toTranscode) {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    toTranscode.get().compress(compressFormat, quality, os);
    toTranscode.recycle();
    return new BytesResource(os.toByteArray());
}