Je n’ai rien écrit depuis longtemps, non pas parce que j’ai souffert beaucoup de tomates et d’œufs dans mes précédents articles, mais parce que je n’ai vraiment rien de réel à écrire pour que tout le monde puisse s’y référer. Mais récemment, alors que j'aidais un ami sur un projet, je suis tombé sur un processus simple de traitement d'image dans Delphi, j'ai donc continué à chercher des informations sur Internet et à parcourir les articles précédents du csdn. À partir de mes résultats de recherche, j'ai découvert que beaucoup de personnes. aurais-je rencontré des problèmes de traitement d'image similaires dans divers projets, mais la plupart des réponses semblent incomplètes (car beaucoup d'entre elles n'ont pas été publiées, ou cela peut être une question d'habitudes personnelles. Haha, j'espère qu'après avoir lu cet article du mien, tout le monde peut commencer à travailler dessus à la maison. J'ai donc écrit les problèmes et les solutions que j'ai rencontrés ci-dessous pour votre référence. En même temps, vous pouvez continuer à fabriquer des briques.
Je dois écrire le problème que je veux résoudre avant le contenu formel, et également donner aux lecteurs une bonne position afin qu'ils ne soient pas ennuyés par ma mauvaise gestion du problème. Le principal problème à résoudre ici est de faire pivoter l'image numérisée avec le scanner de 90 degrés dans Delphi pour obtenir une image appropriée à utiliser, et comme la taille de l'image ne peut pas être saisie correctement, l'image doit simplement être mise à l'échelle. Et ma solution est entièrement basée sur cette exigence, car je ne pense pas beaucoup à l'efficacité et à la clarté après le traitement de l'image, et l'avantage est que le programme semble très simple.
Tout d'abord, je n'ai pas de scanner, donc je ne sais pas quel est le format de l'image obtenue en utilisant le scanner (déjà fourni), et dans l'aide de Delphi, il est écrit "Un bitmap est un objet graphique puissant utilisé pour créer , manipuler (mettre à l'échelle, faire défiler, faire pivoter et peindre) et stocker les images en mémoire et sous forme de fichiers sur un disque", ma première étape consiste donc à convertir mes tranches en TBitmap pour le traitement. Lors de la conversion du format, j'ai modifié la taille réelle de l'image pour l'adapter aux besoins de sélection ultérieure d'une partie de l'image. La fonction est la suivante :
PROcédure TMainForm.ChangeImageFormate;
var Bitmap : TBitmap;
Zoom : Entier ;
commencer
Bitmap := TBitmap.Create;//1
essayer
avec ImageCert, commencez
Bitmap.Assign(Picture.Graphic);//2
Photo := nul;//3
Zoom := Max(Bitmap.Width div Largeur,Bitmap.Height div Hauteur)+1;//4
Largeur := Bitmap.Width div Zoom;//5
Hauteur := Bitmap.Hauteur div Zoom ;//6
Canvas.StretchDraw(Rect(0,0,Largeur,Hauteur),Bitmap);//7
fin;
enfin
Bitmap.Gratuit ;
fin;
fin;
Je pense que ce code n'est pas très compliqué. ImageCert est un contrôle TImage placé sur le formulaire. La seule chose qui peut ne pas vous être familière est la huitième phrase, mais vous pouvez obtenir de nombreuses explications grâce à l'aide de Delphi. Je ne la traduirai pas ici. . (Mon conseil est de lire plus d'aide). En même temps, il convient de souligner que la troisième phrase est très critique. Si vous supprimez cette phrase et que votre format d'image n'est pas bmp, l'erreur "Seul le bitmap peut être modifié" apparaîtra.
La deuxième étape consiste à réaliser la rotation de l'image, car le programme ne nécessite qu'une rotation de 90 degrés à chaque fois, c'est donc plus facile à gérer ici. La méthode de traitement consiste à remplacer en fonction des pixels. Le processus de mise en œuvre est le suivant :
procédure TMainForm.RotateImage;
var x,y : Entier ;
TmpBitMap : TBitmap;
commencer
TmpBitMap := TBitmap.Create;
essayer
TmpBitMap.Assign(ImageCert.Picture.Graphic);
avec ImageCert, commencez
Picture.Bitmap.Height := TmpBitMap.Width;
Picture.Bitmap.Width := TmpBitMap.Height;
pour x:=0 à la hauteur, faites
pour y:=0 à Largeur faire
Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
Hauteur := TmpBitMap.Width;
Largeur := TmpBitMap.Height;
fin;
enfin
TmpBitMap.Free;
fin;
fin;
Il n'y a pas grand-chose à dire dans ce programme, mais les différents paramètres de hauteur et de largeur m'énervent toujours. J'ai toujours l'impression que je dois faire quelque chose de plus, mais je ne peux supprimer aucune ligne. Si quelqu'un est intéressé, vous pouvez. essayez-le. Ce serait mieux si vous me disiez les résultats. Et dans ce cas, puisque TImage et TBitmap ont leur propre canevas, celui à utiliser mérite peut-être d'être étudié, mais en raison du temps limité, je ne l'ai pas essayé.
En ce qui concerne une partie du processus de prise d'image, j'ai utilisé un TShape, puis j'ai défini le style de pinceau sur bsclear et j'ai organisé la position du TShape dans onMouseMove d'ImageCert. Ce n'est pas très sensible car lorsque la souris est sur le TShape, ce ne sera pas le cas. n’aura aucun effet, mais heureusement, l’impact sera faible. En parallèle, j'ai pris quelques photos sous TShape dans l'événement OnMouseDown de TShape. À ce stade, si votre image n'a pas été mise à l'échelle, vous constaterez que l'image supprimée ne correspond pas à la position que nous voyons (bien sûr, lorsque TImage n'affiche pas correctement la taille de l'image).