Autor Beitrag
hansdergott
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 55

XP Mediacenter Edition; XP Home
Delphi
BeitragVerfasst: 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..

ausblenden volle Höhe 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:
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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.03.10 11:34 
Seit wann hat denn Canvas eine SaveToFile Methode? :gruebel:

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?
ausblenden 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, 00, 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.
ausblenden 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, 1010, 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 55

XP Mediacenter Edition; XP Home
Delphi
BeitragVerfasst: 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 user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.

_________________
User haften für Rechtschreibfehler
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.03.10 15:07 
user profile iconhansdergott hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 55

XP Mediacenter Edition; XP Home
Delphi
BeitragVerfasst: 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 user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.

_________________
User haften für Rechtschreibfehler
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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? ;-)