Autor |
Beitrag |
hansdergott
      
Beiträge: 55
XP Mediacenter Edition; XP Home
Delphi
|
Verfasst: So 28.03.10 03:01
Hallo zusammen,
Ich bräuchte mal Eure Hilfe. Ich versuche schon seit 3 Tagen ein Bild in mehrere Teile zu zerteilen und diese dann abzuspeichern
ich hab es bereits mit Pixelfarben auslesen bis hin zu copyrect versucht aber das ergebnis ist immer entweder weiße Bilder oder immer das gleiche Bild oder Bilder die wenn ich zusammensetze nicht zusammen passen
wichtig beim Quellcode ist das ich die Anzahl der Bilder wie z.B 25 (5x5) oder nur 3x3 oder sogar 50x50 selber bestimmen kann
wer kann mir weiterhelfen und mir sagen wie der Code aussehen muss
das ist einer der versuche gewesen..
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| ... if opendialog1.execute then begin image1.picture.loadfromfile(speicherort + data\1.bmp');
// teilma?e x&y berechnen teilmas.x:=round(image1.Width div teile); teilmas.y:=round(image1.height div teile);
// für alle teile in x und y for px:=1 to teile-1 do for py:=1 to teile-1 do begin // Start und Ende der einzelnen Bilder x1:=start.X+(px*teilmas.X); x2:=x1+teilmas.X; y1:=start.y+(py*teilmas.y); y2:=y1+teilmas.y;
// pixel auslesen und in image2 einzeichnen for p1:=x1 to x2 do for p2:=y1 to y2 do begin image1.Canvas.MoveTo(p1,p2); farbe:=image1.Canvas.Pixels[p1,p2]; image2.Canvas.Pixels[p1,p2]:=farbe; end;
image2.picture.savetofile(speicherort + 'bilder\' + inttostr(nr) + '.bmp'); inc(nr); end; .... |
wäre wirklich toll wenn mir jemand weiter helfen könnte
Grüße
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
_________________ User haften für Rechtschreibfehler
Zuletzt bearbeitet von hansdergott am So 28.03.10 15:12, insgesamt 1-mal bearbeitet
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: So 28.03.10 09:59
Entschuldigung, ich sehe dort jetzt leider keinen Befehl, dass er das Image von der im OpenDialog1 ausgewählten Datei laden soll - also es fehlt dort doch schon mal diese Zeile:
Delphi-Quelltext 1:
| Image1.Picture.LoadFromFile(OpenDialog1.FileName) |
- Oder hast Du die Zeile der Übersicht halber in Deinem Posting weggelassen?
In dem Thread 48122 steht auch etwas zu Deinem Thema "Zerteilung", was Dir helfen könnte.
- Oder irre ich mich da?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 28.03.10 11:34
Seit wann hat denn Canvas eine SaveToFile Methode?
Zudem verstehe ich nicht so recht warum du die Breite und Höhe der visuellen TImage-Komponente als Maße des Bildes nimmst. Steht die Komponente auf automatischer Größenanpassung auf das enthaltene Bild?
Pixelweise macht das jedenfalls keinen Sinn, schon gar nicht mit visuellen Komponenten, langsamer geht es schon fast nicht mehr. Wie wäre es so? Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TileBitmap(Src: TBitmap; TilesX, TilesY: Integer; DestFileName: string); var Dest: TBitmap; x, y: Integer; TileWidth, TileHeight: Single; begin TileWidth := Src.Width / TilesX; TileHeight := Src.Height / TilesY; Dest := TBitmap.Create; try for x := 0 to Pred(TilesX) do for y := 0 to Pred(TilesY) do begin Dest.SetSize(Round(Succ(x) * TileWidth) - Round(x * TileWidth), Round(Succ(x) * TileHeight) - Round(x * TileHeight)); StretchBlt(Dest.Canvas.Handle, 0, 0, Dest.Width, Dest.Height, Src.Canvas.Handle, Round(x * TileWidth), Round(y * TileHeight), Round(Succ(x) * TileWidth) - Round(x * TileWidth), Round(Succ(y) * TileHeight) - Round(y * TileHeight), SRCCOPY); Dest.SaveToFile(Format(DestFileName, [x * TilesY + y])); end; finally Dest.Free; end; end; | Das kannst du dann entsprechend aufrufen und fertig. Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Img: TBitmap; begin if dlgOpen.Execute then begin Img := TBitmap.Create; try Img.LoadFromFile(dlgOpen.FileName); TileBitmap(Img, 10, 10, speicherort + 'bilder\Image%d.bmp'); Image1.Picture.Assign(Img); finally Img.Free; end; end; | Für die Anzeige reicht es dann ja nach der Operation mittels Assign das Bild noch in das Image zu kopieren. Wenn auch andere Formate unterstützt werden sollen gibt es entsprechend z.B. TJpegImage.
|
|
hansdergott 
      
Beiträge: 55
XP Mediacenter Edition; XP Home
Delphi
|
Verfasst: So 28.03.10 15:02
Hi
ich habe das laden der Bilder für das Posting weggelassen und das mit dem canvas ist richtig das das falsch ist da ich den Code aus dem Kopf geschrieben hatte
Bye
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
_________________ User haften für Rechtschreibfehler
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 28.03.10 15:07
hansdergott hat folgendes geschrieben : | da ich den Code aus dem Kopf geschrieben hatte |
Ist ja auch sehr sinnvoll nicht den Code direkt zu kopieren sondern nochmal hier neu zu schreiben...
Jedenfalls hast du ja jetzt eine fertige Prozedur, die du direkt benutzen kannst.
|
|
hansdergott 
      
Beiträge: 55
XP Mediacenter Edition; XP Home
Delphi
|
Verfasst: So 28.03.10 15:15
Hallo
Ich hab den Code im ersten Posting verbessert und ich hatte den code aus dem Kopf schreiben müssen da ich nicht zu dieser Zeit an meinem Rechner war
OK, danke für den Code ABER "Dest.SetSize" kennt delphi nicht
was nun
Bye
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
_________________ User haften für Rechtschreibfehler
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 28.03.10 15:18
Wenn du eine so alte Delphiversion noch hast, dann musst du eben Width und Height separat setzen. Denn dass SetSize die Größe setzt, ist doch klar, oder? 
|
|
|