Comment puis-je faire pivoter une image de n'importe quel degré?
J'ai des gif animés et im en utilisant une classe pour analyser les images(frames).
La classe est:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;
using System.IO;
public class AnimatedGif
{
private List<AnimatedGifFrame> mImages = new List<AnimatedGifFrame>();
public AnimatedGif(string path)
{
Image img = Image.FromFile(path);
int frames = img.GetFrameCount(FrameDimension.Time);
if (frames <= 1) throw new ArgumentException("Image not animated");
byte[] times = img.GetPropertyItem(0x5100).Value;
int frame = 0;
for (; ; )
{
int dur = BitConverter.ToInt32(times, 4 * frame);
mImages.Add(new AnimatedGifFrame(new Bitmap(img), dur));
if (++frame >= frames) break;
img.SelectActiveFrame(FrameDimension.Time, frame);
}
img.Dispose();
}
public List<AnimatedGifFrame> Images { get { return mImages; } }
}
public class AnimatedGifFrame
{
private int mDuration;
private Image mImage;
internal AnimatedGifFrame(Image img, int duration)
{
mImage = img; mDuration = duration;
}
public Image Image { get { return mImage; } }
public int Duration { get { return mDuration; } }
}
Maintenant dans form1 je boucle les images dans ce cas 4 et je veux faire tourner l'animation par n'importe quel degré. Maintenant sa rotation de chacune des 45 ou 90 degrés. Je veux ajouter plus d'images(images) pour l'animation, donc si j'ai mis la rotation à 31 ou à 10 degrés, donc je vais voir l'animation de rotation de 10 degrés.
C'est le code de Form1 qui ne fonctionne pas bien. Im en utilisant une fonction de rotation qui je n'ai pas tester encore si son travail.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AnimatedGifEditor
{
public partial class Form1 : Form
{
Image myImage;
AnimatedGif myGif;
Bitmap bitmap;
public Form1()
{
InitializeComponent();
myImage = Image.FromFile(@"D:\fananimation.gif");
myGif = new AnimatedGif(@"D:\fananimation.gif");
for (int i = 0; i < myGif.Images.Count; i++)
{
pictureBox1.Image = myGif.Images[3].Image;
bitmap = new Bitmap(pictureBox1.Image);
rotateImage(bitmap, 76);
pictureBox1.Image = bitmap;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private Bitmap RotateImg(Bitmap bmp, float angle, Color bkColor)
{
int w = bmp.Width;
int h = bmp.Height;
bmp.PixelFormat pf = default(bmp.PixelFormat);
if (bkColor == Color.Transparent)
{
pf = bmp.Format32bppArgb;
}
else
{
pf = bmp.PixelFormat;
}
Bitmap tempImg = new Bitmap(w, h, pf);
Graphics g = Graphics.FromImage(tempImg);
g.Clear(bkColor);
g.DrawImageUnscaled(bmp, 1, 1);
g.Dispose();
GraphicsPath path = new GraphicsPath();
path.AddRectangle(new RectangleF(0f, 0f, w, h));
Matrix mtrx = new Matrix();
//Using System.Drawing.Drawing2D.Matrix class
mtrx.Rotate(angle);
RectangleF rct = path.GetBounds(mtrx);
Bitmap newImg = new Bitmap(Convert.ToInt32(rct.Width), Convert.ToInt32(rct.Height), pf);
g = Graphics.FromImage(newImg);
g.Clear(bkColor);
g.TranslateTransform(-rct.X, -rct.Y);
g.RotateTransform(angle);
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.DrawImageUnscaled(tempImg, 0, 0);
g.Dispose();
tempImg.Dispose();
return newImg;
}
}
}
Le gif animé im en utilisant le test peut être trouvé ici:
"Im using a function for the rotation wich i didnt test yet if its any working."
Test et demander alors si vous avez un problème.
OriginalL'auteur Daniel Lip | 2012-08-19
Vous devez vous connecter pour publier un commentaire.
Je ne comprends pas quel est votre problème, mais je pense que votre code peut être amélioré. Je pense que vous n'avez pas besoin d'utiliser directement l'
Matrix
classe. Il y a certaines fonctions qui fait ce travail pour vous. En effet, les seules choses dont vous avez besoin sont: définir le point de la rotation comme le centre, pivoter les graphiques et dessiner, à l'aide de certaines fonctions par leGraphics
classe.Donc pour faire pivoter une image, vous pouvez utiliser ce code simple:
Pour une raison que si je tourne mon image de plus de 180 degrés à l'aide de cette méthode, il stats à la recherche hexagonale. Aucune idée pourquoi?
Ce code ne fonctionne pas correctement. Ensuite, la rotation de l'image est nettement plus grand que celui d'origine. (environ 30% - 50%), il ne tourne pas dans le point central de l'image d'origine. Vos calculs sont faux.
OriginalL'auteur Omar
Avez-vous essayé RotateFlip?
Source
OriginalL'auteur Rajesh
Basé sur les réponses précédentes, j'ai créé ce code qui ne coupe pas l'image (d'autres exemples n'ont pas de travail pour moi)
Alors que le code de Omar et de Timo ne fonctionne pas, celui-ci donne le résultat attendu. Cependant il y a toujours un problème. Lorsque l'entrée de l'image n'est pas carrée vous TOUJOURS de créer un carré de l'image de sortie. Ce n'est pas logique pour rectangulaire d'entrée des images qui sont en rotation par un petit angle. (par exemple de 15°) Votre calcul à l'aide de l'hypoténuse est mauvais. Pour le faire correctement la formule doit tenir compte de l'angle de rotation pour calculer la avec et la hauteur de l'image de sortie..
vous avez raison, j'ai pu obtenir la taille minimale nécessaire, simplement pour ne pas rogner l'image. Vous êtes libre de fournir une meilleure alternative
La réponse de Timo fonctionne beaucoup mieux même si elle aussi aux cultures de l'image un peu.
OriginalL'auteur Queequeg
J'ai essayé la réponse de @Omar moi-même et réalisé, que l'origine de l'image est coupée sur les côtés ... j'ai réécrit afin qu'il redimensionne l'image pour la nouvelle tailles:
segments de piston-il le même que si vous prenez le négatif +360???
je l'ai utilisé moi-même ... vous devez avoir fait une erreur, puisque les deux codes de travail. Ses Mathématiques simples.
Il semble que j'ai posté ce en vertu de mauvaise réponse. Cependant les deux coins sont rognées. Donc un peu de modification de votre calcul serait nécessaire.
j'extra cette modification de Omars Code en raison de sa Récolte ... celui-ci calcule la nouvelle taille et le définit
OriginalL'auteur Timo Treichel
J'ai été en utilisant cette fonction en VB:
OriginalL'auteur theGD