2010-12-21 5 views
6

Je me demandais s'il est possible de dessiner seulement une partie d'un bitmap après qu'il soit chargé en mémoire sans créer un nouveau bitmap. Je vois Drawable a une méthode setBounds mais je ne suis pas sûr si elle ne dessine que l'ensemble de la zone ou redimensionne juste l'image entière. Je vous remercie.dessiner seulement une partie d'un dessin/Bitmap

Répondre

9

En supposant que vous ayez un canevas principal à dessiner, vous pouvez utiliser l'une des méthodes drawBitmap de la classe Canvas pour dessiner un sous-ensemble du bitmap chargé.

public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)

+1

qui redimensionnerait la totalité de l'image bitmap pour l'insérer dans le rectangle de destination. – jfisk

+3

cela ne serait le cas que si vous définissiez le rectangle source comme étant de la même taille que l'ensemble de l'image source ou qu'elle soit nulle. Définir un rectangle plus petit irait chercher un sous-ensemble. Depuis les pages de manuel "Si le rectangle source n'est pas nul, il spécifie le sous-ensemble de l'image bitmap à dessiner" –

2

J'ai cherché une réponse à exactement cette question afin de pouvoir réutiliser les bitmaps existants pour mon cache d'image et d'éviter la fragmentation de la mémoire (et OutOfMemoryError ultérieure ...), qui a été causée par beaucoup de bitmaps alloués dans différentes parties d'un espace mémoire. En conséquence, j'ai créé simple "BitmapSubsetDrawable" spécialisé, qui s'expose comme une partie arbitraire de la Bitmap souligné (la partie est déterminée par scrRect). Maintenant, j'attribue un ensemble de Bitmaps assez grand une fois, puis les réutilise (canvas.drawBitmap (sourceBitmap, 0, 0, null), sur eux ...) pour le stockage de différentes bitmaps.

Le code principal de la classe est ci-dessous, voir BitmapSubsetDrawable.java pour une utilisation réelle.

import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.ColorFilter; 
import android.graphics.PixelFormat; 
import android.graphics.Rect; 
import android.graphics.drawable.Drawable; 
import android.support.annotation.NonNull; 

public class BitmapSubsetDrawable extends Drawable { 
    private Bitmap bitmap; 
    private Rect scrRect; 

    public BitmapSubsetDrawable(@NonNull Bitmap bitmap, @NonNull Rect srcRect) { 
     this.bitmap = bitmap; 
     this.scrRect = srcRect; 
    } 

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

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

    @Override 
    public void draw(Canvas canvas) { 
     canvas.drawBitmap(bitmap, scrRect, getBounds(), null); 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     // Empty 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
     // Empty 
    } 

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

    public Bitmap getBitmap() { 
     return bitmap; 
    } 
} 
Questions connexes