Ich habe schon lange nichts mehr geschrieben, nicht weil ich in meinen vorherigen Posts unter vielen Tomaten und Eiern gelitten habe, sondern weil ich wirklich nichts Reales habe, das ich als Referenz für alle aufschreiben könnte. Aber als ich kürzlich einem Freund bei einem Projekt half, stieß ich auf einen einfachen Prozess der Bildverarbeitung in Delphi, also suchte ich weiter nach Informationen im Internet und durchsuchte frühere csdn-Beiträge. In meinen Suchergebnissen fand ich so viele Leute Ich wäre in verschiedenen Projekten auf ähnliche Bildverarbeitungsprobleme gestoßen, aber die meisten Antworten, die ich bekam, schienen unvollständig zu sein (weil viele davon noch nicht abgeschlossen waren, oder es könnte eine Frage persönlicher Gewohnheiten sein. Haha, ich hoffe, dass jeder danach mit der Arbeit beginnen kann beim Lesen meines Artikels. Deshalb habe ich die Probleme und Lösungen, auf die ich gestoßen bin, unten als Referenz aufgeführt. Gleichzeitig können Sie gerne weiterhin Ziegel herstellen.
Ich möchte das Problem, das ich lösen möchte, vor dem formalen Inhalt aufschreiben und gleichzeitig den Lesern eine gute Positionierung geben, damit sie sich dabei nicht über meine ungeschickten Methoden ärgern. Das Hauptproblem, das hier gelöst werden muss, besteht darin, das mit dem Scanner in Delphi gescannte Bild um 90 Grad zu drehen, um ein geeignetes Bild für die Verwendung zu erhalten. Da die Größe des Bildes nicht richtig erfasst werden kann, muss das Bild einfach skaliert werden. Und meine Lösung basiert vollständig auf dieser Anforderung, da ich nicht viel über Effizienz und Klarheit nach der Bildverarbeitung nachdenke und der Vorteil darin besteht, dass das Programm sehr einfach aussieht.
Erstens habe ich keinen Scanner, daher weiß ich nicht, welches Format das mit dem Scanner (bereits bereitgestellte) erhaltene Bild hat, und in der Delphi-Hilfe heißt es: „Eine Bitmap ist ein leistungsstarkes Grafikobjekt, das zum Erstellen verwendet wird.“ , manipulieren (skalieren, scrollen, drehen und malen) und speichern Sie Bilder im Speicher und als Dateien auf einer Festplatte“, daher besteht mein erster Schritt darin, meine Slices zur Verarbeitung in TBitmap zu konvertieren. Beim Konvertieren des Formats habe ich die tatsächliche Größe des Bildes geändert, um sie an die Anforderungen anzupassen, die später für die Auswahl eines Teils des Bildes erforderlich sind. Die Funktion ist wie folgt:
Prozedur TMainForm.ChangeImageFormate;
var Bitmap : TBitmap;
Zoom: Ganzzahl;
beginnen
Bitmap := TBitmap.Create;//1
versuchen
Beginnen Sie mit ImageCert
Bitmap.Assign(Picture.Graphic);//2
Bild := Null;//3
Zoom := Max(Bitmap.Width div Breite,Bitmap.Height div Höhe)+1;//4
Breite := Bitmap.Width div Zoom;//5
Höhe := Bitmap.Height div Zoom;//6
Canvas.StretchDraw(Rect(0,0,Width,Height),Bitmap);//7
Ende;
Endlich
Bitmap.Free;
Ende;
Ende;
Ich denke, dieser Code ist nicht sehr kompliziert. Das Einzige, was Ihnen vielleicht unbekannt ist, ist die Hilfe von Delphi . (Mein Rat ist, mehr Hilfe zu lesen). Gleichzeitig ist darauf hinzuweisen, dass der dritte Satz sehr kritisch ist. Wenn Sie diesen Satz entfernen und Ihr Bildformat nicht bmp ist, erscheint die Fehlermeldung „Nur Bitmap kann geändert werden“.
Der zweite Schritt besteht darin, die Drehung des Bildes zu realisieren, da das Programm jedes Mal nur eine Drehung um 90 Grad erfordert, sodass die Handhabung hier einfacher ist. Die Verarbeitungsmethode besteht darin, nach Pixeln zu ersetzen. Der Implementierungsprozess ist wie folgt:
procedure TMainForm.RotateImage;
var x,y : Ganzzahl;
TmpBitMap : TBitmap;
beginnen
TmpBitMap := TBitmap.Create;
versuchen
TmpBitMap.Assign(ImageCert.Picture.Graphic);
Beginnen Sie mit ImageCert
Picture.Bitmap.Height := TmpBitMap.Width;
Picture.Bitmap.Width := TmpBitMap.Height;
für x:=0 bis Height tun
für y:=0 bis Breite do
Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
Höhe := TmpBitMap.Width;
Breite := TmpBitMap.Height;
Ende;
Endlich
TmpBitMap.Free;
Ende;
Ende;
In diesem Programm gibt es nicht viel zu besprechen, aber die verschiedenen Höhen- und Breiteneinstellungen ärgern mich immer, aber ich kann keine Zeilen entfernen. Wenn es jemanden interessiert, können Sie es versuchen Es ist am besten, mir die Ergebnisse mitzuteilen. Und in diesem Fall, da TImage und TBitmap ihre eigene Leinwand haben, könnte es sich lohnen, zu studieren, welche davon verwendet werden soll, aber aus Zeitgründen habe ich es nicht ausprobiert.
Für einen Teil des Bildaufnahmevorgangs habe ich ein TShape verwendet, dann den Pinselstil auf bsclear gesetzt und die Position des TShape in onMouseMove von ImageCert angeordnet. Dies ist nicht sehr empfindlich, da dies der Fall ist, wenn sich die Maus auf dem TShape befindet haben keine Auswirkungen, aber glücklicherweise werden die Auswirkungen gering sein. Gleichzeitig habe ich im OnMouseDown-Event von TShape einige Bilder unterhalb von TShape aufgenommen. Wenn Ihr Bild zu diesem Zeitpunkt nicht skaliert wurde, werden Sie feststellen, dass das entfernte Bild nicht mit der Position übereinstimmt, die wir sehen (natürlich, wenn TImage die Bildgröße nicht korrekt anzeigt).