Comment faire pivoter l'image de x degrés en c#?
J'ai fait quelques recherches et je ne trouve aucune fonction c'est de faire ce que je whant il todo.
J'ai un fichier image d'un document numérisé avec le texte, mais le document est quelques degrés de rotation, donc je veux le faire pivoter le texte étant en ligne avec chaque autre.
Dans un monde parfait, sa doit être une fonction de faire cela automatiquement, mais je ne peux pas trouver quoi que ce soit et ce que je comprends de l'obtenir pour fonctionner automatiquement son besoin d'être certains d'analyser de l'image et je pense que c'est à grand chose todo.
Mais ensuite j'ai fait un outil pour faire pivoter l'image sur un site web à la main, mais maintenant j'ai besoin d'une fonction pour enregistrer la rotation vers le fichier image.
Ce qui semble être quelques différentes méthodes, mais pas de celui que j'ai testé de faire ce que je whant.
La fonction que j'ai trouvé qui fonctionne presque comme je whant est:
public static Bitmap RotateImg(Bitmap bmp, float angle, Color bkColor) {
int w = bmp.Width;
int h = bmp.Height;
PixelFormat pf = default(PixelFormat);
if (bkColor == Color.Transparent)
{
pf = PixelFormat.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; }
Mais cela ne change pas la hauteur et la largeur de l'image du fichier si le fichier image est de la même taille, mais l'image d'un "objet" a été mis à l'échelle et rotation.
Une idée de comment je peux faire ce bon?
Réponse
J'ai trouver la solution qui a marché avec mon image a une résolution de 300 à vieille réponse ici.
double possible de LockBits rotation de l'image, la méthode ne fonctionne pas?
OriginalL'auteur RickardP | 2013-01-06
Vous devez vous connecter pour publier un commentaire.
Si j'ai bien compris votre question, vous souhaitez travailler sur la nouvelle taille de l'image une fois en rotation, et comment la position de l'image pivotée dans sa nouvelle image.
Le diagramme espérons-le, permet de faire clairement la solution. Voici un peu de code pseudo:
Vous voulez faire de la nouvelle image de la newImgWidth et newImgHeight, puis effectuer une rotation autour de l'origine (originX, originY) et puis le rendu de l'image sur ce point. Cela tombe si l'angle (en degrés) n'est pas entre -90 et 0 degrés (représentée). Si elle est comprise entre 0 et 90 degrés, puis il suffit de changer l'origine:
Si elle est dans la plage de 90 ° à 270 degrés (90 degrés) alors c'est un peu plus difficile (voir l'exemple de code ci-dessous).
Votre code de ré-écrit (brièvement testé) - il est un peu douteux, mais semble fonctionner:
Noter les Degrés en Radians de Conversion (180 Degrés == Pi Radians) pour les fonctions trigonométriques
Edit: gros problème était négatif péché valeurs, et moi en train de largeur/hauteur confus lors du calcul de l'origine x/y - cela devrait fonctionner correctement maintenant (testé)
Edit: modifié le code pour gérer n'importe quel angle
pourriez-vous essayer de nouveau, j'ai fait deux erreurs stupides et maintenant ça fonctionne (j'ai bêtement des essais, un près de la place de l'image, ce qui n'aide pas!)
Même résultat avec le dernier code, peut-être que j'ai tort valeurs de l'angle? Que faites-vous respecter? Exemple de ce que je reçois de mon plugin jquery que je devrais le faire pivoter de 3,5 degrés ou -3.5 degrés, donc, c'est ce que je l'envoi en tant que valeurs, est-ce mal?
Le nouveau code doit prendre n'importe quel angle (degrés), et j'ai été regarder la filature (et de travail) sur mon ordinateur. Je vais m'assurer que le code est le même dans les cas que j'ai copié incorrectement. Quel est exactement le problème que vous rencontrez avec le code?
Okej, trouver la fonction presque le même que VisualMelon mais quelques modifications et il fonctionne pour moi avec de grandes résolutions, voir stackoverflow.com/a/4320581/553770
OriginalL'auteur VisualMelon
C'est strictement un commentaire à la belle réponse par VisualMelon ci-dessus, Mais je ne suis pas autorisé à ajouter des commentaires...
Il y a deux petits bugs dans le code
a) La première vérification après le module devrait être scindé en deux, ou modifié, par exemple
Sinon les angles entre -360 et -180 échouera, car seulement +180 +360 ont été traités
b) Juste après la newImg affectation, une résolution affectation est manquant, par exemple
Si omis, l'image sera réduite si la source n'est pas 96 dpi.
....Et le fractionnement des bâtons, des intermédiaires de calculs des dimensions et des compensations devraient être conservés en double, et seulement réduit à flotteur dernier
OriginalL'auteur Eske Rahn