可绘制到位图

时间:2015-11-20 10:54:18

标签: java android bitmap

我有一个使用imageView的应用程序,由用户设置,使用他/她的相机或文件系统。设置图像后,我使用此类来舍入图像的角落:

public class DrawRoundImage extends Drawable {
    private static final boolean USE_VIGNETTE = true;

    private final float mCornerRadius;
    private final RectF mRect = new RectF();
    private final BitmapShader mBitmapShader;
    private final Paint mPaint;
    private final int mMargin;

    public DrawRoundImage(Bitmap bitmap, float cornerRadius, int margin) {
        mCornerRadius = cornerRadius;

        mBitmapShader = new BitmapShader(bitmap,
                Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setShader(mBitmapShader);

        mMargin = margin;
    }

    @Override
    protected void onBoundsChange(Rect bounds) {
        super.onBoundsChange(bounds);
        mRect.set(mMargin, mMargin, bounds.width() - mMargin, bounds.height() - mMargin);

        if (USE_VIGNETTE) {
            RadialGradient vignette = new RadialGradient(
                    mRect.centerX(), mRect.centerY() * 1.0f / 0.7f, mRect.centerX() * 1.3f,
                    new int[] { 0, 0, 0x7f000000 }, new float[] { 0.0f, 0.7f, 1.0f },
                    Shader.TileMode.CLAMP);

            Matrix oval = new Matrix();
            oval.setScale(1.0f, 0.7f);
            vignette.setLocalMatrix(oval);

            mPaint.setShader(
                    new ComposeShader(mBitmapShader, vignette, PorterDuff.Mode.SRC_OVER));
        }
    }

    @Override
    public void draw(Canvas canvas) {
        canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        mPaint.setColorFilter(cf);
    }
}

现在我需要将图像上传到我的服务器,但由于它是一个可绘制的,我无法想象如何将其转回Bitmap,我将其转换为:

Bitmap bitmap = bMap;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

我尝试将drawable转换为这样的Bitmap:

Drawable drawable = imageButton1.getDrawable();
Bitmap bitmap  = ((BitmapDrawable) drawable).getBitmap();

但它引发了这个错误:

  

java.lang.ClassCastException:com.adrissa.klea.model.DrawRoundImage   无法转换为android.graphics.drawable.BitmapDrawable

如何将drawable正确转换为位图?当我谷歌所有我发现是关于可绘制资源到位图的问题。

2 个答案:

答案 0 :(得分:1)

以下是将drawable转换为位图的方法:

Bitmap pic = BitmapFactory.decodeResource(getResources(), R.drawable.example);

答案 1 :(得分:0)

@KæmpeKlunker,看看这个解决方案:

https://stackoverflow.com/a/10600736/4137318

您可能必须覆盖DrawRoundImage课程中的以下方法,才能使此解决方案正常运行:

@Override
public int getIntrinsicHeight() {
    return (int) mRect.height();
}

@Override
public int getIntrinsicWidth() {
    return (int) mRect.width();
}