![]() |
AW: 2 Dimensionales Array übergeben
Probeversion zum reinschnuppern
![]() Zitat:
gruss |
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:
zum testen speichern
if GDIP_CreateBitmapFromScan0(w, rc.Bottom, w * 4, PixelFormat32bppARGB,
PByte(ImgData2D[0]), imgSpectrum) <> OK then
Delphi-Quellcode:
GDIP_SaveImageToFile(ExtractFilePath(ParamStr(0)) + '\Text.png', imgSpectrum, Ord(QualityModeHigh));
Anschauen! Fertig. gruss |
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. |
AW: 2 Dimensionales Array übergeben
Zitat:
Ich kann Hunderte von Images speichern und alle sind korrekt. Kannst du gerne glauben. Und zwar nach jedem Draw..
Delphi-Quellcode:
gruss
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)); |
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. |
AW: 2 Dimensionales Array übergeben
Zitat:
20 Bilder im gleichen Zug auf die Platte geknallt.
Delphi-Quellcode:
Also Zufall ist das keiner ansonsten wären alle oder zumindest eins davon falsch.
if IntI < 20 then
begin GDIP_SaveImageToFile(ExtractFilePath(ParamStr(0)) + '\Text_' + IntToStr(IntI) + '.png', imgSpectrum, Ord(QualityModeHigh)); inc(IntI); end; Könnte jetzt auch Hundert machen wäre das selbe. Aber gut ich lasse deine Funktion drin. gruss |
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): |
AW: 2 Dimensionales Array übergeben
Zitat:
Wollte es nur mal ansprechen. gruss |
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; |
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 10:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz