Announcement

Collapse
No announcement yet.

GDI+ (ATL) CImage verkleinern?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GDI+ (ATL) CImage verkleinern?

    Ich habe nun einiges versucht aber komme nicht zum Ziel; ich habe ein Bild in einem CImage und möchte es verkleinern,so dass es danach wieder im CImage gespeichert ist (keine Kopie des Originals benötigt).
    In C# hatte ich ähnliches geschafft aber in C++ geht es halt etwas anders
    Die Bearbeitung sollte in guter Qualität (mit InterpolationModeHighQualityBicubic) erfolgen.
    Habe folgende Versuche:
    img ist die CImage-Instanz mit dem Original, welche durch das verkleinerte Bild überschrieben werden sollte, width und height sind die Zielgrössen.
    Code:
    inline void Resize(int width, int height) {
    	
    	Gdiplus::InterpolationMode mode=Gdiplus::InterpolationModeHighQualityBicubic;
    	CBitmap b;
    	CDC c;
    	c.CreateCompatibleDC(NULL);
    	
    	b.CreateBitmap(width, height, 1, 32, NULL);
    	c.SelectObject(b);
    	//img.Draw(b.get... klappt nicht mit dem Gerätekontext
    	img.Attach(b);
    
    	
    	/*
    	Gdiplus::Graphics g(img2.GetDC());
    	g.SetInterpolationMode(mode);
    	g.DrawImage(reinterpret_cast<Gdiplus::Image*>(&img), 1,1,width, height);
    	*/
    	
    }
    Vergrössert oder verkleinert darstellen war kein Problem nur bekomme ich es nie in ein CImage-Objekt wieder hinein.
    Als Beispiel die Druckfunktion:
    Code:
    void CmfcBildbearbeitungView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
    {
    	pDC->SetStretchBltMode(COLORONCOLOR);
    	img.Draw(*pDC,0,0);
    	CView::OnPrint(pDC, pInfo);
    }
    Entspricht hier die Qualität etwa dem InterpolationModeHighQualityBicubic oder zeichnet StretchBlt mit COLORON... vereinfacht?

    Nach weiteren Versuchen bin ich soweit:
    Code:
    inline void Resize(int width, int height) {
    	
    	Gdiplus::InterpolationMode mode=Gdiplus::InterpolationModeHighQualityBicubic;
    	CBitmap b;
    	CDC c;
    	CDC* imgDC=(CDC*)img.GetDC();
    	c.CreateCompatibleDC(NULL);
    	
    	b.CreateBitmap(width, height, 1, 32, NULL);
    	
    	c.SelectObject(b);
    	img.Draw(c.m_hDC,0,0,width, height,0,0,img.GetWidth(), img.GetHeight());
        
    	img.Attach((HBITMAP)b.Detach());
    //  c.BitBlt(0,0,width,height,imgDC,0,0,SRCCOPY);
    Dieser Code zeichnet das Bild tatsächlich, allerdings erst nach einigen Debug-Assertion Fehlermeldungen und dann ist ein Bildausschnitt vorhanden, anstatt das verkleinerte Bild...

    Vielen Dank!
    Zuletzt editiert von C.M.Obrecht; 28.12.2008, 18:41. Reason: Weitere Versuche gemacht

  • #2
    Ansonsten sind natürlich andere Tips willkommen, wie ich ein Bild (mit höchstmöglicher Qualität) skalieren kann.

    Comment

    Working...
    X