Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Bilder in zb 25 Teile zerteilen


hansdergott - So 28.03.10 03:01
Titel: Bilder in zb 25 Teile zerteilen
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..


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


ffgorcky - 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 [http://www.delphi-forum.de/viewtopic.php?p=48122#48122] steht auch etwas zu Deinem Thema "Zerteilung", was Dir helfen könnte.
- Oder irre ich mich da?


jaenicke - 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?

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.

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 - 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.


jaenicke - 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 - 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.


jaenicke - 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? ;-)