2013-08-26 3 views
0

ex .:Comment échanger des régions en bitmap

J'ai une taille de bitmap 500x500. Et sur cette image, j'ai des coordonnées pour 2 régions. une région est à X = 10, Y = 10, taille 10x10 seconde région est à X = 400, Y = 400, taille 10x10

Quel serait le meilleur moyen d'échanger ces deux régions dans le bitmap.

Répondre

0

Hm, une approche simple « cruelle » peut faire le travail:

Chargez le bitmap dans un tableau 2 dimensions et échanger vos cellules.

Il faudra environ: 500x500x4 octets, ce qui est un peu moins d'un méga-octet de mémoire, ce qui n'est rien pour les téléphones Android aujourd'hui puisque l'application a au moins 8/16 mgb de RAM à leur utilisation. plus faibles téléphones)

de plus, les opérations seront assez vite, même si vous faites un tas de traitement des cartes de bits, telles que le redimensionnement et ainsi de suite .....

Si vous wont la meilleure performance possible utiliser le code natif, il existe des bibliothèques pour le traitement des bitmaps qui sont assez mémoire et cpu efficace.

1

Vous pouvez le faire à travers la toile.

Quelque chose comme:

Bitmap swapped = Bitmap.createBitmap(origin.getWidth(), origin.getHeight(), origin.getConfig()); 
Canvas drawer = new Canvas(swapped); 
drawer.drawBitmap(origin, new Rect(0,0,100,100), new Rect(100,100,100,100), paint); 
drawer.drawBitmap(origin, new Rect(100,100,100,100), new Rect(0,0,100,100), paint); 

A ce stade, votre « troqué » Bitmap aura les pièces d'origine drawed dans différentes régions.

Pour plus voir la documentation de toile:

http://developer.android.com/reference/android/graphics/Canvas.html#drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint)

0

La meilleure façon serait le même que celui de commutation tout type de données:

  • créer un bitmap temporaire pour contenir les données de zone 1 et y mettre les données.
  • placez les données de zone2 dans la zone1.
  • placez les données de phototrame temporaires dans area2 et recyclez le bitmap temporaire.

Voici un exemple de code que j'ai écrit. Ce n'est pas testé, mais devrait fonctionner:

Bitmap origin=...; 
Rect r1=...,r2=... ; //assumption: both rectangles are of the same size 
//copy from region1 to temp bitmap 
Bitmap temp= Bitmap.createBitmap(origin,r1.left,r1.top,r1.width(),r1.height()); 
//copy from region2 into region1 
Canvas canvas=new Canvas(origin); 
canvas.drawBitmap(origin, r2, r1, new Paint()); 
//copy from temp bitmap to region2 
canvas.drawBitmap(temp, new Rect(0,0,r2.width(),r2.height()), r2, paint); 
temp.recycle(); 

Une autre façon (ce qui pourrait être mieux en termes de vitesse et/ou de la mémoire) serait d'utiliser le tableau int à la place d'un nouvel objet bitmap, mais je pense que cette méthode est facile à comprendre.

est ici l'alternative:

Bitmap origin=...; 
Rect r1=...,r2=... ; //assumption: both rectangles are of the same size 
//copy from region1 to temp pixels 
int[] pixels=new int[r1.width()*r1.height()]; 
origin.getPixels (pixels, 0, origin.getWidth(), r1.left, r1.top, r1.width(), r1.height()); 
//copy from region2 into region1 
Canvas canvas=new Canvas(origin); 
canvas.drawBitmap(origin, r2, r1, new Paint()); 
//copy from temp pixels to region2 
origin.setPixels (pixels, 0, origin.getWidth(), r2.left, r2.top, r2.width(), r2.height()); 

J'espère que je ne l'ai pas fait d'erreur ici, puisque je ne l'ai pas testé.

Questions connexes