Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi 2 Dimensionales Array übergeben (https://www.delphipraxis.net/200110-2-dimensionales-array-uebergeben.html)

EWeiss 22. Mär 2019 21:59

AW: 2 Dimensionales Array übergeben
 
Probeversion zum reinschnuppern gibt es hier.

Zitat:

Für pures GDI+ wirst du wenig Quellen finden, aber viele .NET Quelltextbeispiele, die sich mit den Elementen aus System.Drawing beschäftigen, wären ratsam anzuschauen.
Du hast dich extra schlau gemacht? Danke!

gruss

EWeiss 25. Mär 2019 08:58

AW: 2 Dimensionales Array übergeben
 
Wir haben uns so viel Kopf gemacht das Array zu kopieren eigentlich ganz einfach.
Eine Variable definieren.

Delphi-Quellcode:
ImgData2D: TBytes;


Das Array reinkopieren.
Delphi-Quellcode:
ImgData2D := @SpectrumData2D[0, 0];


übergeben
Delphi-Quellcode:
if GDIP_CreateBitmapFromScan0(w, rc.Bottom, w * 4, PixelFormat32bppARGB,
  PByte(ImgData2D[0]), imgSpectrum) <> OK then
zum testen speichern
Delphi-Quellcode:
GDIP_SaveImageToFile(ExtractFilePath(ParamStr(0)) + '\Text.png', imgSpectrum, Ord(QualityModeHigh));


Anschauen! Fertig.

gruss

Neutral General 25. Mär 2019 09:07

AW: 2 Dimensionales Array übergeben
 
Mach das nicht!
FALLS das klappt, dann nur mit Glück und an jedem ersten Mittwoch des Monats!

Dein Code kopiert gar nichts. Es ist das Gleiche als würdest du direkt @SpectrumData2D[0, 0] übergeben.

EWeiss 25. Mär 2019 09:21

AW: 2 Dimensionales Array übergeben
 
Zitat:

FALLS das klappt, dann nur mit Glück und an jedem ersten Mittwoch des Monats!
Test es doch bitte.. ;)
Ich kann Hunderte von Images speichern und alle sind korrekt.
Kannst du gerne glauben.

Und zwar nach jedem Draw..
Delphi-Quellcode:
  if FSymmetrical then
  begin
    GDIP_DrawImageRectI(grWindow, imgSpectrum, round(Sh), 0, round(-Sh), round(Sh * 2 + 1));
    GDIP_DrawImageI(grWindow, imgSpectrum, round(Sh), 0);
  end else
  GDIP_DrawImageI(grWindow, imgSpectrum, 0, 0);

//  GDIP_SaveImageToFile(ExtractFilePath(ParamStr(0)) + '\Text.png', imgSpectrum, Ord(QualityModeHigh));
gruss

Neutral General 25. Mär 2019 09:29

AW: 2 Dimensionales Array übergeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich brauch das nicht zu testen.
Es ist falsch, selbst wenn es funktioniert.
Dann hast du nur unendliches Glück, dass alle Unter-Arrays direkt hintereinander im Speicher liegen.
Das kannst und darfst du allerdings nicht annehmen!

Habe mal nachgebaut was du quasi machst (siehe Ahnhang).
Wie du siehst sind in meinem 1D ByteArray nur die Einträge aus arr[0], also der ersten Zeile.

EWeiss 25. Mär 2019 09:32

AW: 2 Dimensionales Array übergeben
 
Zitat:

Zitat von Neutral General (Beitrag 1428628)
Ich brauch das nicht zu testen.
Es ist falsch, selbst wenn es funktioniert.
Dann hast du nur unendliches Glück, dass alle Unter-Arrays direkt hintereinander im Speicher liegen.
Das kannst und darfst du allerdings nicht annehmen!

Habe mal nachgebaut was du quasi machst (siehe Ahnhang).
Wie du siehst sind in meinem 1D ByteArray nur die Einträge aus arr[0], also der ersten Zeile.

Hmm.. nun gut ich glaube dir destotrotz siehe dir die Bilder an die sagen alles. (Musst du aber nicht) ;)
20 Bilder im gleichen Zug auf die Platte geknallt.

Delphi-Quellcode:
  if IntI < 20 then
  begin
    GDIP_SaveImageToFile(ExtractFilePath(ParamStr(0)) + '\Text_' + IntToStr(IntI) + '.png', imgSpectrum, Ord(QualityModeHigh));
    inc(IntI);
  end;
Also Zufall ist das keiner ansonsten wären alle oder zumindest eins davon falsch.
Könnte jetzt auch Hundert machen wäre das selbe.

Aber gut ich lasse deine Funktion drin.

gruss

Neutral General 25. Mär 2019 09:45

AW: 2 Dimensionales Array übergeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mach es einfach nicht.
Es kann sein, dass es jetzt gerade funktioniert.
Aber es kann genauso gut sein, dass es auf ein mal aus heiterem Himmel nicht mehr funktioniert wenn du irgendwo ganz wo anders was im Code änderst, was das Speicherlayout des Prozesses etwas verändert. Und dann kracht es und du hast keine Ahnung was los ist.

Hab nochmal im CPU-Fenster ein Screenshot gemacht, der nochmal genau verdeutlicht was bei 2D Arrays passieren kann (und dann funktioniert deine Methode nicht mehr):

EWeiss 25. Mär 2019 09:50

AW: 2 Dimensionales Array übergeben
 
Zitat:

Mach es einfach nicht.
Ich habe es entfernt und verwende deine Funktion wie bisher ist sicherer.
Wollte es nur mal ansprechen.

gruss

Neutral General 25. Mär 2019 10:16

AW: 2 Dimensionales Array übergeben
 
Meine Funktion ist auch nicht die schnellste.
Hab sie auf Verständlichkeit ausgelegt.

Das hier ist wahrscheinlich noch ein Stück schneller + sicherer:
Delphi-Quellcode:
function Array2DTo1D(AArray: TArray2D): TArray1D;
var y, rowLen: Integer;
begin
  if Length(AArray) > 0 then
  begin
    rowLen := Length(AArray[0]);
    SetLength(Result, Length(AArray) * rowLen);
    for y := 0 to High(AArray) do
      Move(AArray[y][0], Result[y * rowLen], rowLen);
  end
  else
    SetLength(Result ,0);
end;

EWeiss 26. Mär 2019 04:52

AW: 2 Dimensionales Array übergeben
 
Du sagst das nichts kopiert wird.. das ist richtig!
Aber das 1 Dimensionale Array wird auf die komplette länge des 2 Dimensionalen gesetzt mehr brauche ich nicht.
Ich muss keine Bytes hin und her verschieben denn da gibt es keine.
Das 2 Dimensionale Array enthält keine es wird nur auf das Bitmap hin ausgerichtet.

Fakt ist doch das hier
Delphi-Quellcode:
ImgData2D := @SpectrumData2D[0, 0];


Die komplette Länge eines 2 Dimensionalen Arrays sich anschließend in einem 1 Dimensionalen befindet.
Wäre es nicht so würde ich das Bitmap mit dem Array gar nicht füllen und abspeichern können.
Es ist nicht das gleiche als wenn ich

Delphi-Quellcode:
@SpectrumData2D[0, 0];

direkt übergeben würde.

TBytes ist definiert in SysUtils als
Delphi-Quellcode:
TBytes = array of Byte;


gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.
Seite 4 von 5   « Erste     234 5      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz