1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Gdi+

    • Frage
  • Swoncen
  • 23. März 2006 um 23:35
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • Swoncen
    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.

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

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum