Dans une application C intégrée, j'ai une grande image que je voudrais faire pivoter de 90 degrés. Actuellement, j'utilise la méthode simple bien connue algorithme pour le faire. Cependant, cet algorithme m'oblige à faire une autre copie de l'image. J'aimerais éviter d'allouer de la mémoire pour une copie, je préfère faire la rotation sur place. Comme l'image n'est pas carrée, c'est délicat. Quelqu'un connaît-il un algorithme approprié ?
Modifié pour ajouter une clarification, parce que les gens demandent :
Je stocke une image dans le format habituel :
// Images are 16 bpp
struct Image {
int width;
int height;
uint16_t * data;
};
uint16_t getPixel(Image *img, int x, int y)
{
return img->data[y * img->width + x];
}
J'espère pouvoir déplacer le contenu de la section data
autour, puis échangez le width
et height
variables membres. Ainsi, si je commence avec une image de 9x20 pixels, puis que je la fais pivoter, je me retrouverai avec une image de 20x9 pixels. Cela change le pas de l'image, ce qui complique beaucoup l'algorithme.
4 votes
Comment comptez-vous faire pivoter une image non carrée sans allouer d'espace supplémentaire ? Prévoyez-vous d'échanger les indices x/y au cours du processus ?
0 votes
Pouvez-vous nous dire en détail comment l'image est stockée exactement ?
3 votes
Oh, un tableau plat... Duh, j'aurais dû y penser.
0 votes
Un problème intéressant. Je suppose que si l'image est monochrome à 1 bit par pixel, cela pourrait ajouter un autre niveau de complexité au problème.
0 votes
Je rencontre ce problème pourtant lorsque je traite une image yuv420p, je dois la faire pivoter de 90deg puis la convertir au format jpeg. J'ai vraiment besoin de la faire pivoter sur place car l'image est un flux vidéo, environ 25 fps, et nécessite une faible latence. Quelqu'un pourrait-il me donner un algorithme efficace ?
0 votes
Je rencontre ce problème pourtant lorsque je traite une image yuv420p, je dois la faire pivoter de 90deg puis la convertir au format jpeg. J'ai vraiment besoin de la faire pivoter sur place car l'image est un flux vidéo, environ 25 fps, et nécessite une faible latence. Quelqu'un pourrait-il me donner un algorithme efficace ?