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.
Vergrössert oder verkleinert darstellen war kein Problem nur bekomme ich es nie in ein CImage-Objekt wieder hinein.
Als Beispiel die Druckfunktion:
Entspricht hier die Qualität etwa dem InterpolationModeHighQualityBicubic oder zeichnet StretchBlt mit COLORON... vereinfacht?
Nach weiteren Versuchen bin ich soweit:
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!
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); */ }
Als Beispiel die Druckfunktion:
Code:
void CmfcBildbearbeitungView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { pDC->SetStretchBltMode(COLORONCOLOR); img.Draw(*pDC,0,0); CView::OnPrint(pDC, pInfo); }
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);
Vielen Dank!
Comment