1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Gdi+

    • Frage
  • Swoncen
  • 23. März 2006 um 23:35
  • Unerledigt
  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 23. März 2006 um 23:35
    • #1

    Hallo!

    Ich hab folgendes Problem: Ich möchte ein Bild mittels GDI+ in den Speicher laden. Danach speicher ich mir die Pixeldaten in meiner Datenstruktor (linear im Speicher) indem ich alle Pixel einzeln rüberkopier und dann mach ich weiter mit meiner Datenstruktur. Das Problem ist, dass es schon eine Zeit braucht, auch wenn ich den Algorithmus schon sehr optimiert habe. Jetzt bin ich aber zu der Idee gekommen, dass ich einfach den Daten-Pointer von der Instanz der Klasse "Bitmap" von der GDI+ mittels LockBits und UnlockBits hole und meinen Pointer einfach auf diesen Speicher zeigen lasse. Die Struktur ist genau dieselbe, und es funktioniert auch. Somit hab ich eine echt extreme Zeitersparniss, trotzdem funktionierts nicht wirklich.. Das Problem ist jetzt, dass das "Bitmap" Objekt wieder gelöscht wird und der Speicher nicht mehr reserviert ist und mit der Zeit schreib ich irgendwann mal auf verbotenem Speicher und alles endet in einer AccessViolation. Mein Code zur veranschaulichung:

    Code
    [size=10][COLOR=blue]VS_EImageStatus[/COLOR] VS_Image::LoadImage([COLOR=blue]WCHAR[/COLOR]* [COLOR=gray]wc_FileName[/COLOR])
    {
       [COLOR=blue]GdiplusStartupInput[/COLOR] [COLOR=gray]gdiplusStartupInput[/COLOR];
       [COLOR=blue]ULONG_PTR[/COLOR] [COLOR=gray]gdiplusToken[/COLOR];
       GdiplusStartup(&[COLOR=gray]gdiplusToken[/COLOR], &[COLOR=gray]gdiplusStartupInput[/COLOR], NULL);
       [COLOR=blue]Bitmap[/COLOR]* [COLOR=gray]InputImage[/COLOR] = [/SIZE][size=10]new[/SIZE][size=10] [COLOR=blue]Bitmap[/COLOR]([COLOR=gray]wc_FileName[/COLOR]);
       [COLOR=blue]uint32[/COLOR] [COLOR=gray]uiWidth[/COLOR] = [COLOR=gray]InputImage[/COLOR]->GetWidth();
       [COLOR=blue]uint32[/COLOR] [COLOR=gray]uiHeight[/COLOR] = [COLOR=gray]InputImage[/COLOR]->GetHeight();
    [/SIZE][size=10]   [COLOR=blue]this[/COLOR][/SIZE][size=10]->AllocateImage([COLOR=gray]uiWidth[/COLOR], [COLOR=gray]uiHeight[/COLOR], 3);
       [COLOR=blue]uint8[/COLOR]* [COLOR=gray]pImage[/COLOR] = [/SIZE][size=10][COLOR=blue]this[/COLOR][/SIZE][size=10]->GetDataPtr();
       [COLOR=blue]uint32[/COLOR] [COLOR=gray]uiStep[/COLOR] = [/SIZE][size=10][COLOR=blue]this[/COLOR][/SIZE][size=10]->GetWidthStep();
       [COLOR=blue]Rect[/COLOR] *[COLOR=gray]pRect[/COLOR] = [/SIZE][size=10]new[/SIZE][size=10] Rect(0,0,[COLOR=gray]uiWidth[/COLOR],[COLOR=gray]uiHeight[/COLOR]);
       [COLOR=blue]BitmapData[/COLOR] *[COLOR=gray]pData[/COLOR] = [/SIZE][size=10]new[/SIZE][size=10] [COLOR=blue]BitmapData[/COLOR]();
       InputImage->LockBits([COLOR=gray]pRect[/COLOR], 0, [COLOR=indigo]PixelFormat24bppRGB[/COLOR], [COLOR=gray]pData[/COLOR]);
    [/SIZE][size=10][COLOR=green]//    this[/COLOR][/SIZE][size=10][COLOR=green]->SetDataPtr((uint8*)pData->Scan0);[/COLOR]
    [/SIZE][size=10][COLOR=green]//    this[/COLOR][/SIZE][size=10][COLOR=green]->SetWidthStep(pData->Stride);[/COLOR]
    [/SIZE][size=10]   for[/SIZE][size=10]([COLOR=blue]uint32[/COLOR] [COLOR=gray]nJ[/COLOR]=0;[COLOR=gray]nJ[/COLOR]<[COLOR=gray]uiHeight[/COLOR];[COLOR=gray]nJ[/COLOR]++)[/SIZE]
    [size=10]   {
    [/SIZE][size=10]       for[/SIZE][size=10]([COLOR=#0000ff]uint32[/COLOR] [COLOR=#808080]nI[/COLOR]=0;[COLOR=#808080]nI[/COLOR]<[COLOR=#808080]uiWidth[/COLOR];[COLOR=#808080]nI[/COLOR]++)
            {
               *((([COLOR=#0000ff]uint8[/COLOR]*) [COLOR=#808080]pImage[/COLOR] + 0 + nJ * [COLOR=#808080]uiStep[/COLOR]) + (nI*3)) = 
                  *((([COLOR=#0000ff]uint8[/COLOR]*) [COLOR=#808080]pData[/COLOR]->Scan0 +0+ nJ * [COLOR=#808080]pData[/COLOR]->Stride) + ([COLOR=#808080]nI[/COLOR]*3));
               *((([COLOR=#0000ff]uint8[/COLOR]*) [COLOR=#808080]pImage[/COLOR] + 1 + nJ * [COLOR=#808080]uiStep[/COLOR]) + (nI*3)) =
                  *((([COLOR=#0000ff]uint8[/COLOR]*) [COLOR=#808080]pData[/COLOR]->Scan0 +1+ nJ * [COLOR=#808080]pData[/COLOR]->Stride) + ([COLOR=#808080]nI[/COLOR]*3));
               *((([COLOR=#0000ff]uint8[/COLOR]*) [COLOR=#808080]pImage[/COLOR] + 2 + nJ * [COLOR=#808080]uiStep[/COLOR]) + (nI*3)) =
                  *((([COLOR=#0000ff]uint8[/COLOR]*) [COLOR=#808080]pData[/COLOR]->Scan0 +2+ nJ * [COLOR=#808080]pData[/COLOR]->Stride) + ([COLOR=#808080]nI[/COLOR]*3));
            }
       }
       InputImage->UnlockBits(pData);
       GdiplusShutdown(gdiplusToken);
    [/SIZE][size=10][COLOR=#0000ff]   return[/COLOR][/SIZE][size=10] IMAGE_OK;
    }
    [/SIZE]
    Alles anzeigen



    In der Schleife wird normalerweise kopiert, aber ich möchte ja nur den Pointer haben, damits schneller geht (auskommentiert).
    Die Frage ist jetzt: Wie kann ich mir den Pointer holen, sodass der Speicher nicht wieder für alle beschreibbar wird? Sozusage den Speicher wieder reservieren? ich wüsst nichtmal, wonach ich im Google dafür suchen sollte. Bitte um Rat.

    640K ought to be enough for anybody. :eek2:

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 24. März 2006 um 15:07
    • #2

    Ich habs jetzt mit realloc versucht.. funktioniert auch nicht. Falls jemand eine Lösung weiß, bitte melden.

    640K ought to be enough for anybody. :eek2:

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung