【问题标题】:Android Scaling Canvas BitmapAndroid 缩放画布位图
【发布时间】:2011-06-22 23:49:34
【问题描述】:

我有一个绘图应用程序,允许用户在空白画布上绘图。我正在尝试绘制当前位图的缩放“缩略图”,以便当用户在视图中缩放时,他们可以参考缩略图以了解它们在整个绘图画布中的位置。我有缩放工作,并且在正确的位置显示缩略图,但是当添加新的线条/形状时,缩略图似乎没有在后续的 onDraws 上更新。

所以我可以访问此视图的底层位图(显示缩略图,能够轻松地将位图保存到文件等),我在 onSizeChanged() 中为视图执行以下操作:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    // set the canvas height, panning, etc, based on the now inflated View
    mWidth      = getWidth();
    mHeight     = getHeight();
    mAspectRatio    = mWidth / mHeight;
    mPanX       = 0;
    mPanY       = 0;

    // create the Bitmap, set it to the canvas
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mCanvas.setBitmap(mBitmap);
draw(mCanvas);
}

然后,当用户绘制并调用 invalidate() 时,我在 onDraw() 中执行以下操作以生成缩略图:

@Override
protected void onDraw(Canvas canvas) {
    <snipped code that draws paths, shapes to canvas>

    if (mScaled) {
        Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int) thumbHeight, false);
        canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint);
    }
}

缩略图使用 thumbCanvasPaint 显示在 thumbnailRectF 定义的空间中,但在随后的 onDraw() 调用中,缩放的位图并没有改变其原始状态,即使全尺寸活动画布显示所有绘图,等等。根据一些测试,在我看来,当我使用对 draw(mCanvas); 的初始调用设置位图时,后续的 onDraws 正在写入基础位图,而不是在 onSizeChanged() 中指定的位图。

所以,我想我想弄清楚如何将 onDraw 画布绑定到一个位图,我可以随时访问以执行重新调整大小、保存等。看着this question,我认为 draw(mCanvas );调用会将 onDraw 绑定到 mCanvas 中指定的位图(在我的例子中是 mBitmap),但实际上,就画布的更新而言,它似乎不起作用。

谢谢,

保罗

【问题讨论】:

    标签: android bitmap android-canvas


    【解决方案1】:

    通过Bitmap.createScaledBitmap 缩放位图然后绘制将不起作用

    画布位图缩放的解决方案是使用这个函数(来自docs

    void drawBitmap (Bitmap bitmap,  Rect src, Rect dst, Paint paint)
    // dst : Rect: The rectangle that the bitmap will be scaled/translated to fit into
    

    所以通过改变dst的大小,你的位图大小会改变

    如果我想在左上角绘制位图并将其缩放到100px x 120px,这是一个示例

    Bitmap bitmap = BitmapFactory.decodeResource(...);//bitmap to be drawn
    
    float left = 0;
    float top = 0;
    RectF dst = new RectF(left, top, left + 100, top + 120); // width=100, height=120
    
    canvas.drawBitmap(bitmap, null, dst, null);
    

    【讨论】:

      【解决方案2】:
      canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 
      

      应该改为

      canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint);
      

      不需要

      Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int)....
      

      同时检查 mScaled 在缩放大于 1 时是否始终为真

      【讨论】:

      • 哇,是的,链接程序的构造几乎 100% 相同,除了我将位图绑定到画布等问题。现在尝试这个解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多