2013-03-03 15 views
9

Có ai có gợi ý hay giải thích cho sự cố sau không? Tôi vẽ một đường dẫn với một bitmapshader. Khi canvas không được thu nhỏ, có vẻ tốt (ảnh đầu tiên). Khi tôi mở rộng (phóng to), bitmapshader không được thu nhỏ và trông rất xấu. Tôi đã thử nhiều thứ với tái tạo bitmapshader sau khi phóng to, nhưng đã không thành công :-(Có ai có một gợi ýbitmapshader và canvas.scaling android

Không Scaling có vẻ tốt:.?

enter image description here

khi mở rộng quy mô có vẻ xấu xí :

enter image description here

Code:

canvas.scale(scalex, scaley); 
    canvas.translate(itranslatex, itranslatey); 


    fillBMP = makePatternCross(fscalex, 1, Color.GREEN/*,fscalex,fscaley*/); 
    fillBMPshader = new BitmapShader(fillBMP, BitmapShader.TileMode.REPEAT, BitmapShader.TileMode.REPEAT); 
    paintshader = new Paint(); 
    paintshader.setShader(fillBMPshader); 


    canvas.drawPath(cpath.path, paintshader); 



private static Bitmap makePatternCross(float fSize, float fStrokewith,int iColor) { 
    Log.v("Create Patter makePatternCross","makePatternCross"); 

    float fBitmapSizeOrig = 10; 
    fBitmapSizeOrig=fBitmapSizeOrig*fSize; 
    Bitmap bm = Bitmap.createBitmap((int)fBitmapSizeOrig,(int) fBitmapSizeOrig,Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(bm); 
    //c.scale(200, 200); 
    c.drawColor(Color.WHITE); 
    Paint p = new Paint(); 
    p.setColor(iColor); 
    //p.setStrokeWidth(iStrokewith); 
    p.setStrokeWidth(fStrokewith/fSize); 
    p.setStrokeWidth((float) 0.000001); 
    c.drawLine(0, 0, fBitmapSizeOrig, fBitmapSizeOrig, p); 
    c.drawLine(0, fBitmapSizeOrig, fBitmapSizeOrig, 0, p); 

    if (fSize != 1) { 
     int iNewSize = (int) ((fBitmapSizeOrig) * fSize); 
     bm = Bitmap.createScaledBitmap(bm, iNewSize, iNewSize, false); 
    } 

    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      if (bm.getPixel(x, y) == Color.WHITE) { 
       bm.setPixel(x, y, Color.TRANSPARENT); 
      } else { 
       // bm.setPixel(x, y, bm.getPixel(x, y)); 
      } 
     } 
    } 
    return bm; 
} 

Trả lời

2

Không chắc chắn chính xác nếu đây là những gì bạn đang tìm kiếm. Nhưng nếu bạn sử dụng ma trận để chia tỷ lệ bitmap, nó vẫn giữ được chất lượng hơn so với tỷ lệ bình thường.

Matrix matrix = new Matrix(); 
matrix.postScale(desiredScale, desiredScale); 
Bitmap scaledBitmap = Bitmap.createBitmap(sampledSrcBitmap, 0, 0, sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true); 

Ngoài ra khi đi từ một độ phân giải thấp hơn đến một cao hơn bạn có thể thử này cũng như:

Options options = new BitmapFactory.Options(); 
options.inScaled = false; 
Bitmap source = BitmapFactory.decodeResource(a.getResources(), path, options); 
+0

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. Nhưng đây không phải là giải pháp. Tôi đã thử mã của bạn với các giá trị khác nhau, nhưng vẫn như cũ. Tôi đã giải quyết vấn đề bằng một cách mới. Tôi vẽ hoa văn của mình bằng những con đường và giao cắt với khu vực tôi thích. Sau đó, không có quy mô mở rộng xuất hiện. –

+0

@mcflysoft cũ nhưng nếu bạn giải quyết, vui lòng xem xét giải pháp đăng – Prashant