# [c++] Bitmap in Größe ändern



## ulmi (23. Oktober 2006)

Hallo,

ich 2 klitzekleine) Probleme.
1.)
Gibt es eine Möglichkeit, über Ressourcen eingebundene Bitmaps in ihrer Größe zu ändern?
Mit LoadImage und einer Datei geht das ja prima.

```
pc_Preview_ctrl.SetBitmap((HBITMAP)LoadImage(NULL, "PGXLogo.bmp", IMAGE_BITMAP, 511, 383, LR_LOADFROMFILE | LR_CREATEDIBSECTION |LR_LOADTRANSPARENT));
```
Aber da ich nicht von separaten Dateien abhängig sein möchte, würde ich gern hier die Ressourcen benutzen. Ich hatte mir gedacht, wenn ich mit SetBitmapDimension(x,y) die Größe ändere ,und dann einfach SetBitmap() benutze ist alles tutti paletti. Aber denkste, die Größe des Bitmaps konnte ich damit nicht ändern.
Mein nächster Versuch war, mit LoadImage(NULL,MAKEINTRESOURCE(xxx),...) dem Ganzen an den Kragen zu gehen aber auch das funktioniert nicht.

Kann mir irgendwer eine Tip geben, wo ich den Fehler mache?

2.)
Wenn ich mit

```
pc_Preview_ctrl.SetBitmap((HBITMAP)LoadImage(NULL, "Dateiname.bmp", IMAGE_BITMAP, 511, 383, LR_LOADFROMFILE | LR_CREATEDIBSECTION |LR_LOADTRANSPARENT));
```
ein Bitmap lade und die Größe reduziere, werden dann nur Zeilen/Spalten ausgelassen oder wird der Mittelwert über Pixel gebildet? (Ich glaube ja Ersteres)

Wenn auch hier jemand eine Aussage machen kann, wäre ich dankbar dafür


MfG Ulmi


----------



## pschilling (11. April 2007)

Hi ulmi,

wenn du das Bild immer in derselben Größe verwenden möchtest, schlage ich vor, du bringst es mit einem vernünftigen Grafikprogramm in die gewünschte Größe und verwendest dieses dann..

Wenn du die Zieldimensionen erst zur Laufzeit kennst würde ich dir folgendes vorschlagen, bzw. musst du folgendes machen :

Deine Zielbitmap als Membervariable :

CBitmap m_myBmp;



```
void loadImage(CString fileName, int width, int height){
    HBITMAP hBmp = LoadImage(...);
    if( hBmp ) {
        // Temporäre Bitmap erzeugen und geladene Bitmap attachen.
        CBitmap tmpBmp
        tmpBmp.Attach(hBmp);

        // DC erzeugen und Bitmap selektieren
        CDC srcDC;
        srcDC.CreateCompatibleDC(GetWindowDC());     
        CBitmap *pOldBmp = srcDC.SelectObject(tmpBmp);
                
        BITMAP bmp;
        bmp.GetBitmap(&bmp);
        // Zur Info : bmp.biWIdth und bmp.biHeight => Bitmapdimensionen
        
        // Ziel Bitmap erzeugen
        m_myBmp.CreateCompatibleBitmap(&srcDC,width,height);
        // Noch einen DC erzeugen und die Ziel-Bitmap selektieren
        CDC dstDC;
        dstDC.CreateCompatibleBitmap(&srcDC);
        CBitmap *pOldBmp1 = dstDC.SelectObject(&m_myBmp);
        
        // Die Quell-Bitmap nun per StretchBlt() aus dem srcDC in den dstDC kopieren.
        dstDC.StretchBlt(/* Die parameter darfst du selber herausfinden ;-)*/ );

        srcDC.SelectObject(pOldBmp);
        dstDC.SelectObject(pOldBmp1);
        
}
```

Den Code habe ich gerade freihändig geschrieben.Also hafte ich für nix ;-)

Falls du den Code so verwendest, poste mir bitte ob er funktionuckelt hat.

Schönen Gruß,

Peter


----------



## pschilling (11. April 2007)

Hi noch mal,

sehe gerade dass du reine Windows Api verwendest.
Mein Beispiel basiert auf MFC.

Der Weg sollte und die entsprechenden Windowsfunktionen sollten aber klar sein.

Viel Erfolg,

Peter


----------

