begin process at 2010 07 29 15:25:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

PPC :: Graphisme

 > ROTATION D'IMAGE POUR LE COMPACT FRAMEWORK

ROTATION D'IMAGE POUR LE COMPACT FRAMEWORK


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :PPC :: Graphisme Source .NET ( DotNet ) Classé sous :net, cf, ppc, graphique Niveau :Débutant Date de création :06/08/2007 Date de mise à jour :08/08/2007 16:23:15 Vu :9 938

Auteur : P0lO

Ecrire un message privé
Site perso
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Bonjour à tous et à toutes!
ceci est juste une petite fonction en C# pour palier à l'absence de méthode de rotation d'image dans le Compact Framework,...
dans un premier temps on va calculer la taille de l'image après rotation puis on applique un couleur d'arrière plan à la nouvelle image (ici on prendra arbitrairement la couleur du pixel (0,0) de l'image d'origine pour couleur d'arrière plan, et enfin on va chercher pour chacun des pixels de l'image finale le pixel correspondant dans l'image d'origine...

Source

  • public static System.Drawing.Bitmap Rotate(System.Drawing.Bitmap ImageSource, int angle)
  • {
  • //Déclaration des variables utiles à la rotation
  • System.Drawing.Bitmap RotatedImage;
  • int i;
  • int j;
  • System.Drawing.Color couleur;
  • int mx, my, mxdest, mydest;
  • int bx, by;
  • double angle_radian;
  • double tcos;
  • double tsin;
  • double largeurdest;
  • double hauteurdest;
  • //calcul de l'angle en radian, ainsi que du cosinus et sinus de l'angle qui seront utiliser régulièrement
  • angle_radian = -angle * Math.PI / 180.0;
  • tcos = Math.Cos(angle_radian);
  • tsin = Math.Sin(angle_radian);
  • //calcul de la taille maximal de l'image après rotation (pour éviter de perdre des "morceaux d'image"
  • largeurdest = Math.Ceiling(ImageSource.Width * Math.Abs(tcos) + ImageSource.Height * Math.Abs(tsin));
  • hauteurdest = Math.Ceiling(ImageSource.Width * Math.Abs(tsin) + ImageSource.Height * Math.Abs(tcos));
  • //Instanciation de l'image finale avec la taille calculer
  • RotatedImage = new System.Drawing.Bitmap((int)Math.Ceiling(largeurdest), (int)Math.Ceiling(hauteurdest));
  • //Calcul du centre de l'image source et de l'image après rotation (pour recentrer l'image)
  • mxdest = RotatedImage.Width / 2;
  • mydest = RotatedImage.Height / 2;
  • mx = ImageSource.Width / 2;
  • my = ImageSource.Height / 2;
  • //On applique comme couleur d'arrière plan de notre nouvelle image la couleur du premier pixel de l'image d'origine (arbitraire)
  • for (j = 0; j < RotatedImage.Height; j++)
  • {
  • for (i = 0; i < RotatedImage.Width; i++)
  • {
  • RotatedImage.SetPixel(i, j, ImageSource.GetPixel(0, 0));
  • }
  • }
  • //rotation de l'image
  • for (j = 0; j < RotatedImage.Height; j++)
  • {
  • for (i = 0; i < RotatedImage.Width; i++)
  • {
  • //On recherche les coordonnées du pixel i,j de la nouvelle image dans l'image source
  • bx = (int)(Math.Ceiling(tcos * (i - mxdest) + tsin * (j - mydest) + mx));
  • by = (int)(Math.Ceiling(-tsin * (i - mxdest) + tcos * (j - mydest) + my));
  • if (bx >= 0 && bx < ImageSource.Width && by >= 0 && by < ImageSource.Height)
  • {
  • //On récupère la couleur du pixel bx,by de l'image source
  • couleur = ImageSource.GetPixel(bx, by);
  • //On recopie la couleur trouver dans le pixel correspondant
  • RotatedImage.SetPixel(i, j, couleur);
  • }
  • }
  • }
  • return RotatedImage;
  • }
public static System.Drawing.Bitmap Rotate(System.Drawing.Bitmap ImageSource, int angle)
{
    //Déclaration des variables utiles à la rotation
    System.Drawing.Bitmap RotatedImage;
    int i;
    int j;
    System.Drawing.Color couleur;
    int mx, my, mxdest, mydest;
    int bx, by;
    double angle_radian;
    double tcos;
    double tsin;
    double largeurdest;
    double hauteurdest;

    //calcul de l'angle en radian, ainsi que du cosinus et sinus de l'angle qui seront utiliser régulièrement
    angle_radian = -angle * Math.PI / 180.0;
    tcos = Math.Cos(angle_radian);
    tsin = Math.Sin(angle_radian);

    //calcul de la taille maximal de l'image après rotation (pour éviter de perdre des "morceaux d'image"
    largeurdest = Math.Ceiling(ImageSource.Width * Math.Abs(tcos) + ImageSource.Height * Math.Abs(tsin));
    hauteurdest = Math.Ceiling(ImageSource.Width * Math.Abs(tsin) + ImageSource.Height * Math.Abs(tcos));

    //Instanciation de l'image finale avec la taille calculer
    RotatedImage = new System.Drawing.Bitmap((int)Math.Ceiling(largeurdest), (int)Math.Ceiling(hauteurdest));

    //Calcul du centre de l'image source et de l'image après rotation (pour recentrer l'image)
    mxdest = RotatedImage.Width / 2;
    mydest = RotatedImage.Height / 2;
    mx = ImageSource.Width / 2;
    my = ImageSource.Height / 2;

    //On applique comme couleur d'arrière plan de notre nouvelle image la couleur du premier pixel de l'image d'origine (arbitraire)
    for (j = 0; j < RotatedImage.Height; j++)
    {
        for (i = 0; i < RotatedImage.Width; i++)
        {
            RotatedImage.SetPixel(i, j, ImageSource.GetPixel(0, 0));
        }
    }

    //rotation de l'image
    for (j = 0; j < RotatedImage.Height; j++)
    {
        for (i = 0; i < RotatedImage.Width; i++)
        {
            //On recherche les coordonnées du pixel i,j de la nouvelle image dans l'image source
            bx = (int)(Math.Ceiling(tcos * (i - mxdest) + tsin * (j - mydest) + mx));
            by = (int)(Math.Ceiling(-tsin * (i - mxdest) + tcos * (j - mydest) + my));
            if (bx >= 0 && bx < ImageSource.Width && by >= 0 && by < ImageSource.Height)
            {
                //On récupère la couleur du pixel bx,by de l'image source
                couleur = ImageSource.GetPixel(bx, by);
                
                //On recopie la couleur trouver dans le pixel correspondant
                RotatedImage.SetPixel(i, j, couleur);
            }
        }
    }
    return RotatedImage;
}

 Conclusion

Ce code source est optimisable je pense mais en tout cas il est fonctionnel, n'ésitez pas à me signaler les éventuelles difficultés pour faire fonctionner ce code...
Attention ce code n'a pas pour prétention de faire mieux que les méthode éxistantes dans le Framework 2.0 complet mais juste de pallier à l'absence de ces méthodes dans le CompactFramework...


 Historique

08 août 2007 16:23:15 :
Déplacement de la source sur http://www.pdafr.com/

 Sources de la même categorie

Source .NET (Dotnet) CAPTURE ECRAN (SCREENSHOT) par boutemine
Source .NET (Dotnet) ROTATION ET MIROIR DE BITMAP par Stephane33
Source avec Zip Source .NET (Dotnet) VISUALISER UNE IMAGE PLEIN ÉCRAN AVEC DÉPLACEMENT par Stephane33
Source avec Zip Source avec une capture Source .NET (Dotnet) TRACER UN RECTANGLE OU UN CERCLE SUR POCKETPC 2002 AVEC .NET par Nix

Commentaires et avis

Commentaire de Stephane33 le 13/08/2007 13:58:40 administrateur CS

J'ai utilisé une technique similaire l'année dernière ....> en Vb.net http://www.pdafr.com/codes/ROTATION-MIROIR-BITMAP_38975.aspx

Commentaire de P0lO le 13/08/2007 17:53:02

Salut!
Mis à que nos 2 codes traites de rotation d'image je ne vois pas ce qu'il ont de similaire désolé...
Les algorithme de rotation ne sont pas les mêmes, tu ne proposait qu'une fonction RotateLeft et Miroir ici il faut passer l'angle désiré en paramètre,...
De plus tu ne redimenssionait pas le nouveau Bitmap alors qu'ici étant donné que l'angle est quelconque je redimenssione le nouveau Bitmap pour éviter de perdre des "morceaux d'image",...
Regarde bien mon code et dis moi ce qui est similaire?
Cordialement...

Commentaire de Stephane33 le 15/08/2007 01:13:12 administrateur CS

Désolé je ne voulais pas te vexer.
En fait mon image après rotation n'est pas tronquée, je ne perd pas de "morceaux d'images"
Quand je dis similaire, c'était plus sur le principe de la copie de pixels par pixels
Je me suis limité qu'a des rotations simples, qui sont absentes de Compact Framework, mais bien présentes dans le Framework 1.0
;)

Commentaire de P0lO le 16/08/2007 08:55:34

Tu ne m'a pas vexé mais je suis un peu sur les nerfs (boulot),...Effectivement ton image ne sera pas tronquée car tu effectue une rotation de 90° ici je prend un angle quelconque donc si je ne redimenssione pas l'image pour certain angles je vais perdre des morceaux de l'image,...
Sinon éffectivement si tu parlait de la copie pixel par pixel oui il s'agit de la même technique, mais de toutes façon à moins d'utiliser des dll externes il me semble qu'il n'y à pas beaucoup de solutions...
Je ne comprend pas pourquoi Microsoft à retiré certaine chose du Compact Framework puisque ce genre de fonctions sont plus que utile,...
Par contre pourquoi personne ne note les sources ici?

Commentaire de nico4nicolas le 14/09/2007 05:02:47

J'ai fait presque la même chose en un peu moins bien, je ne gère pas le rognage des bords mais dans mon cas, ça n'a pas d'importance.
La seule remarque constructive que je peux me permettre de faire c'est que les fonctions GetPixel et SetPixel sont très lentes, dès qu'il s'agit de traiter des images assez importantes, on sent tout de suite la limite. Par contre, je ne sais pas comment remplacer ces fonctions mais ça me parait impératif...

Commentaire de Stephane33 le 14/09/2007 13:49:01 administrateur CS

Je crois qu'ils ont réglé ce problème avec la CF2

Commentaire de P0lO le 19/09/2007 00:29:23

Bonjour!
J'ai mis au point cette méthode pour faire des rotations de petites images (moin de 30 pixels sur 30 pixels) donc cela ne me pose pas de problèmes mais éffectivement la rotation peut devenir très lente mais cela dépend non seulement des Get/SetPixel mais aussi de l'angle de rotation choisi,...
Pour ce qui est d'améliorer ce code on peut éssayer d'autre méthode en passant par des pointeurs (ce qui implique de vérrouiller en mémoire l'image d'abord pour éviter qu'elle ne soit déplacée en mémoire) mais ce n'est pas le but ici puisque ma fonction à pour but de proposer une fonction simple et haut niveau donc facilement compréhensible par des débutants par exemple,...

Commentaire de tafoune le 12/06/2008 02:00:42

salut,
dabor je voulais vous remercier pour ce code, et je voulais savoir est ce que pour appeler cette fonction faut juste metre l'image dans dans un pictureBox (pict par exemple) et definir l'angle par exemple 20°,puis faire
pict.Image = Rotate(pict.Image, 20)
Si c'est le cas, en faisant ca j'obtient cette erreur:"The best overloaded method match for 'monprojet.Rotate(System.Drawing.Bitmap, int)' has some invalid arguments"
d'apres ce que j'ai compris le probleme reside dont la synthaxe que j'ai utiliser poru appeler la fonction...
j'attends vos reponses
merci.

Commentaire de P0lO le 12/06/2008 07:45:35

Salut,
de mémoire, l'image contenue dans une pictureBox est au format System.Drawing.Image, l'erreur viens donc tout simplement du fait que l'image que tu passe en paramètre à la méthode n'est pas dans le bon format,... Si l'image que tu place dans ta pictureBox est au format System.Drawing.Bitmap essaye ceci sa devrait fonctionner :
pict.Image = Rotate((System.Drawing.Bitmap)pict.Image, 20);

Bon courage...

Commentaire de tafoune le 12/06/2008 13:00:57


salut,
Merci beaucoup pour votre reponse rapide ^^, ca resoud le probeleme.

Commentaire de Donpi le 03/11/2009 17:08:16

Je veux pas trop m'avancer mais un petit coup de lockbit pourrais te faire gagner pas mal de performance
A+

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

RSS XML PPC [ par manu00 ] Bonjour, je dois developper un lecteur de flux rss sur pocket pc mais je ne sais pas par ou commencer... Que me conseillez vous ? Visual Basic .net ou vb.net Lancer un executable sur ppc [ par garocheb ] Bonjour, Je suis un nouveau en vb.net et je n'arrive pas a trouver comment on peux lancer un executable se trouvant dans "\my documents\12.exe" Aidez Recevoir infrarouge sur Smartphone ou PPC [ par azerty25 ] BonjourJe voudrais faire un programme, de pr&#233;f&#233;rence en .NET, qui m'affiche les codes que le mat&#233;riel re&#231;oi par le port IR.Dans le [.NET2 CF]IrCOMM et IrDA [ par NHenry ] Bonjour,J'utilise un PPC, j'ai constaté que pour mes essais, j'ai 3 PPC pour mes tests, un seul a le port IrCOMM en COM2, les autres je ne sais pas.J' .NET CF datagrid, changer la backcolor de certaines lignes [ par oo7jb5 ] Bonjour à tous,Est possible de changer la backcolor / mettre en gras certaines lignes d'un datagrid (.NET CF), de la façon suivante :lst = new List&lt Url encode [ par aurel16 ] Bonjour, Après plusieurs heures de recherche sur le net, je ne sais pas comment Urlencoder une chaîne sous CF .net. Avec le framework .net j'utilisai synthèse vocale [ par spilz ] Bonjour à tous, je commence à programmer un peu en C# pour mon PPC sous wm6.5, et j'aimerai réaliser une application capable de lire un fichier texte [déplacé VB. NET -> PDA] progressbar [ par byllu ] Bonjour, savez vous comment faire pour pivoter une progress bar, afin de la mettre verticale, avec le 0 vers le bas de la feuille? Car j'ai regard Gestion de fichier accès direct avec VB2008 sur Pocket PC [ par Ch_Collins ] Bonjour à tous, C'est mon premier message et j'espère que ma question n'est pas idiote. J'ai 60 ans et j'ai, il y a longtemps programmé pour le plaisi Modifier image VB.NET Compact Framework [ par rere62960 ] Bonjour, Je veux créer un bouton sous la forme d'un contrôle utilisateur. Il y a donc une image de fond (BTN_ENFONCE) et une image au dessus (BTN_R


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juillet 2010
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales