AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia PByteArray - Scanline für große Bilder
Thema durchsuchen
Ansicht
Themen-Optionen

PByteArray - Scanline für große Bilder

Ein Thema von bernhard_LA · begonnen am 19. Jun 2018 · letzter Beitrag vom 19. Jun 2018
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

PByteArray - Scanline für große Bilder

  Alt 19. Jun 2018, 07:38
ich verwende PByteArray und scanline um große Bilder zu bearbeiten. Wenn aber die Pixelanzahl*3 >32767 ist bekomme ich einen Range Check error. Kann ich die Größe von TByteArray dynamisch an meine Bildgröße anpassen ?




Delphi-Quellcode:
unit System.SysUtils;


  PByteArray = ^TByteArray;
  TByteArray = array[0..32767] of Byte;


Delphi-Quellcode:
procedure MeineBildverarbeitung(..........);


    ByteLine : pbyteArray;
    i, j : Integer;
    xmax : Integer;
    ymax : Integer;

  begin

    aBmp.pixelformat := pf24bit;

    for j := ystart to ymax do
      begin

        ByteLine := aBmp.ScanLine[ j ];




            BValueArray[ i - xstart, j - ystart ] := ByteLine[ 3 * i ];
            GValueArray[ i - xstart, j - ystart ] := ByteLine[ 3 * i + 1 ];
            RvalueArray[ i - xstart, j - ystart ] := ByteLine[ 3 * i + 2 ]; // range error kommt hier
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: PByteArray - Scanline für große Bilder

  Alt 19. Jun 2018, 09:05
Nein, das Array hat eine statische Länge und die kann eben nicht geändert werden.

Du kannst den Range-Check aber gezielt für diesen Part ausschalten:

Delphi-Quellcode:

procedure MeineBildverarbeitung(..........);
  type
    PScanline: ^TScanline;
    TScaneline: array[0..0] of byte; // JEDES statisch definierte Array erfüllt prinzipiell die Anforderung
  var
    ByteLine : PScanline;
    i, j : Integer;
    xmax : Integer;
    ymax : Integer;

  begin

    aBmp.pixelformat := pf24bit;

    for j := ystart to ymax do
      begin

        ByteLine := aBmp.ScanLine[ j ];
{$R-} // Rangecheck AUS
            BValueArray[ i - xstart, j - ystart ] := ByteLine[ 3 * i ];
            GValueArray[ i - xstart, j - ystart ] := ByteLine[ 3 * i + 1 ];
            RvalueArray[ i - xstart, j - ystart ] := ByteLine[ 3 * i + 2 ];
{$R+} // Rangecheck EIN
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#3

AW: PByteArray - Scanline für große Bilder

  Alt 19. Jun 2018, 09:15
Sauberer wäre es, wenn du auf PByteArray verzichtest und PByte nutzt:

Delphi-Quellcode:
procedure MeineBildverarbeitung(..........);
  type
    PScanline: ^TScanline;
    TScaneline: array[0..0] of byte; // JEDES statisch definierte Array erfüllt prinzipiell die Anforderung
  var
    dst : PByte;
    i, j: Integer;
    xmax : Integer;
    ymax : Integer;

  begin

    aBmp.pixelformat := pf24bit;

    for j := ystart to ymax do
      begin

        dst := aBmp.ScanLine[ j ];
        inc(dst, xstart*3);
        for i := 0 to xmax-xstart do
        begin
            BValueArray[i, j - ystart ] := dst^; inc(dst);
            GValueArray[i, j - ystart ] := dst^; inc(dst);
            RvalueArray[i, j - ystart ] := dst^; inc(dst);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: PByteArray - Scanline für große Bilder

  Alt 19. Jun 2018, 10:46
Ich war mal davon ausgegangen, dass Delphi bei  array[0..0] of ... die Bereichsprüfungen deaktiviert,
aber dem ist leider nicht so.

Also sollte man sort, wo man solche Pointer auf solche Arrays verwendet, selbst dafür sorgen, dass sie nicht aktiv ist.

Oder man nimmt einen Zeiger auf array[0..WasGroßes] of ... .
array[0..High(NativeInt) div SizeOf(DerTyp) div 256 - 2 * SizeOf(NativeInt)] of DerTyp
$2B or not $2B
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
488 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: PByteArray - Scanline für große Bilder

  Alt 19. Jun 2018, 13:17
Prinzipiell lässt es sich auch mit einem dynamischen Array lösen (hatte das mal so gemacht früher), ist allerdings etwas komplizierter. Hatte dafür TArray<TRgbTriple> verwendet.
Dennis
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: PByteArray - Scanline für große Bilder

  Alt 19. Jun 2018, 23:31
habe jetzt diese verwendet


Delphi-Quellcode:
type

  PLargeByteArray = ^TLargeByteArray;
  TLargeByteArray = array of Byte;

und dann in der Funktion


Delphi-Quellcode:
    
   aScanLineARRAY : TLargeByteArray ;
    ysize : Integer ;
   

  begin

    aBmp.pixelformat := pf24bit;

    ysize := round (aBMP.Width *3) ;

    setlength( aScanLineARRAY, ysize );

    ....
           ByteLine := aBmp.ScanLine[ j ];



            BValueArray[ i - xstart, j - ystart ] := aScanLineARRAY[ 3 * i ];
            GValueArray[ i - xstart, j - ystart ] := aScanLineARRAY[ 3 * i + 1 ];
            RvalueArray[ i - xstart, j - ystart ] := aScanLineARRAY[ 3 * i + 2 ];

    ..

Geändert von bernhard_LA (19. Jun 2018 um 23:33 Uhr)
  Mit Zitat antworten Zitat
Alt 7. Aug 2018, 11:17     Erstellt von elisawise
Dieser Beitrag wurde von mkinzler gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 Uhr.
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