DIB verkleinern

Kaiser206

Erfahrenes Mitglied
Hallo,
ich suche nach einer Möglichkeit eine DIB ohne mfc zu verkleinern. Ich besitze alle Informationen um einen bmp header zusammenzusetzen und habe die dib als unsigned char* vorliegen:

Code:
int width = 100;
int height = 100;
int bitCount = 16;
unsigned char* dib; //ein einfaches bmp

Jetzt würde ich gerne den dib auf 50x50 verkleinern. Kann mir da jemand einen Ansatz geben?

Danke im Vorraus!
----
(winXP/g++)
 
Hallo,

was ist die Quelle deiner DIB bzw. wie soll die verkleinerte Bitmap später weiterverwendet werden? Größenänderungen leistet nämlich auch die API-Funktion StrechBlt(), ohne dass man sich auf die Ebene der Pixelmanipulationen herunterbemühmen muss.

Gruß
MCoder
 
Vielen Dank für den Tipp mit StrechBlt!
Damit geht es!
Hier ein modifizierter ausschnitt aus meinem Code, sieht so aus als hätte ich da keine gravierenden Fehler drin:
Code:
        int width, height, bitcount; //bitmap daten
        unsigned char* data; //die dib mit den datan
        int faktor; //der streckfaktor 1 = 1%; 100=100%;usw...

        HBITMAP hbm         = CreateCompatibleBitmap(hdc, width, height);
        HDC memDC1         = CreateCompatibleDC( hdc );
        HBITMAP hbmOld    = (HBITMAP)SelectObject( memDC1, hbm );
        BITMAPINFO bmi;
        memset(&bmi, '\0', sizeof(bmi));
        bmi.bmiHeader.biSize               = sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biWidth             = width;
        bmi.bmiHeader.biHeight            = heigth;
        bmi.bmiHeader.biBitCount         = bitcount;
        bmi.bmiHeader.biPlanes           = 1;
        bmi.bmiHeader.biCompression  = BI_RGB;
        bmi.bmiHeader.biSizeImage      = (bitcount+1) * width * height / 8;
        SetDIBits( memDC1,
                           hbm,
                           0,
                           bmi.bmiHeader.biHeight,
                           data,
                           &bmi,
                           DIB_RGB_COLORS );
        HDC     memDC2 = CreateCompatibleDC(hdc);
        HBITMAP hbm2   = CreateCompatibleBitmap(hdc, width*n/100, height*n/100);
        SelectObject(memDC2, hbm2);
        StretchBlt(memDC2,
                           0, 0,
                           width*faktor/100, height()*faktor/100,
                           memDC1,
                           0, 0,
                           width, height,
                           SRCCOPY);
        memset(&bmi, '\0', sizeof(bmi));
        bmi.bmiHeader.biSize                = sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biWidth              = width*faktor/100;
        bmi.bmiHeader.biHeight             = height*faktor/100;
        bmi.bmiHeader.biBitCount          = bitcount;
        bmi.bmiHeader.biPlanes            = 1;
        bmi.bmiHeader.biCompression   = BI_RGB;
        bmi.bmiHeader.biSizeImage       = (bmi.bmiHeader.biBitCount+1) * (bmi.bmiHeader.biWidth) * (bmi.bmiHeader.biHeight) / 8;
        unsigned char* pbBits = (unsigned char*) malloc(bmi.bmiHeader.biSizeImage);
        GetDIBits( memDC2,
                   hbm2,
                   0,
                   bmi.bmiHeader.biHeight,
                   pbBits,
                   &bmi,
                   DIB_RGB_COLORS );
        SelectObject(memDC2, hbmOld);
        DeleteDC(memDC2);
        SelectObject(memDC1, hbmOld);
        DeleteDC(memDC1);
        DeleteObject(hbm);
        DeleteObject(hbm2);
        width  = width*faktor/100;
        height = height*faktor/100;
        free(data);
        Data = pbBits;

Als Anmerkung muss ich ich allerdings hinzufügen das die Verkleinerung SCHEUßLICH ist! Laut msdn wird der Verkleinerungdmodus des Device Contexts benutzt auf den ich verkleinere. Gibt es da eigendlich nicht irgendwelche verkleinerungs Algorithmen, die sinnvoller verkleinern, zb die Farbe von benachbarten Pixeln beeinflussen?
 
Zuletzt bearbeitet:
Zurück