SORU
27 Ocak 2011, PERŞEMBE


/Ölçekleme, yeniden boyutlandırma sonra kötü görüntü kalitesi bit eşlem

Bir kart oyunu yazıyorum ve kartlarımı farklı koşullarda, farklı boyutlarda olması gerekiyor. Hızlı bir şekilde çizilmiş ve yeniden (animasyon) böylece bit eşlem olarak benim görüntüleri saklamak ediyorum.

Benim sorunum denemek için ne kadar önemli ve benim görüntüleri (matris yoluyla olsun.ölçek yok yani postScale, bir matris.preScale veya createScaledBitmap işlevi) onlar her zaman karmaşık ve bulanık çıkıyor. Yeniden boyutlandırma olmadan çizilen bu ölçek görüntüleri mükemmel görünüyor, çünkü soruna neden gidelim biliyorum.

Her çözüm bu iki iş parçacığı tarif ile çalıştım:
android quality of the images resized in runtime
quality problems when resizing an image at runtime

ama hala hiçbir yerde bulamadım.

Benim bit eşlem (bir hashmap içine) bu kod ile ben mağaza:

cardImages = new HashMap<Byte, Bitmap>();
cardImages.put(GameUtil.hearts_ace, BitmapFactory.decodeResource(r, R.drawable.hearts_ace));

ve bu yöntemle onları çizmek (Kart sınıf):

public void drawCard(Canvas c)
{
    //retrieve the cards image (if it doesn't already have one)
    if (image == null)
        image = Bitmap.createScaledBitmap(GameUtil.cardImages.get(ID), 
            (int)(GameUtil.standardCardSize.X*scale), (int)(GameUtil.standardCardSize.Y*scale), false);

        //this code (non-scaled) looks perfect
        //image = GameUtil.cardImages.get(ID);

    matrix.reset();
    matrix.setTranslate(position.X, position.Y);

    //These methods make it look worse
    //matrix.preScale(1.3f, 1.3f);
    //matrix.postScale(1.3f, 1.3f);

    //This code makes absolutely no difference
    Paint drawPaint = new Paint();
    drawPaint.setAntiAlias(false);
    drawPaint.setFilterBitmap(false);
    drawPaint.setDither(true);

    c.drawBitmap(image, matrix, drawPaint);
}

Herhangi bir fikir büyük mutluluk duyacağız. Teşekkürler

CEVAP
19 EYLÜL 2011, PAZARTESİ


Kullanım createScaledBitmap görüntü çok kötü görünüyor yapacaktır. Bu sorunla karşılaştım ve azimliyim. Kod sorunu çözecektir aşağıda:

public Bitmap BITMAP_RESIZER(Bitmap bitmap,int newWidth,int newHeight) {    
    Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, Config.ARGB_8888);

    float ratioX = newWidth / (float) bitmap.getWidth();
    float ratioY = newHeight / (float) bitmap.getHeight();
    float middleX = newWidth / 2.0f;
    float middleY = newHeight / 2.0f;

    Matrix scaleMatrix = new Matrix();
    scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

    Canvas canvas = new Canvas(scaledBitmap);
    canvas.setMatrix(scaleMatrix);
    canvas.drawBitmap(bitmap, middleX - bitmap.getWidth() / 2, middleY - bitmap.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));

    return scaledBitmap;

    }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS Campus Life

    ASUS Campus

    18 Mart 2013
  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007