Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

DX7 und DirectDraw-Antialiasing

IDE-ATAPI / 10 Antworten / Baumansicht Nickles

Hallo, bezweifle zwar dass mir da jemand weiterhelfen kann aber trotzdem;


Hab ein Problem mit DirectDraw. Ich lade ein Bitmap mit Hilfe von Funktionen der "ddutil.h". (Also ganz der Standardweg)


Wenn ich das Bitmap jetzt mit bitblt vergrößert darstelle wirkt es verschwommen, wie durch Antialiasing, kann man das abstellen ?


Thx,


IDE-ATAPI

bei Antwort benachrichtigen
Borlander IDE-ATAPI „DX7 und DirectDraw-Antialiasing“
Optionen
Wenn ich das Bitmap jetzt [...] vergrößert darstelle wirkt es verschwommen
Warum nimmst Du kein größeres Bitmap?
Wenn Bitmaps größer dargestellt werden sollen als sie eigentlich sind bleibt ein Qualitätsverlust natürlich nicht aus...

CU Borlander
bei Antwort benachrichtigen
IDE-ATAPI Nachtrag zu: „DX7 und DirectDraw-Antialiasing“
Optionen

'n Abend, so spät noch wach? :)

An dem liegts nicht, auch wenn ich sie in der Originalgröße lasse, sind sie
verschwommen. Ich merke das am Colorkeying, die Farbe ist dann nicht abgegrenzt durchsichtbar, sondern wie durch antialiasing am Rand verschwommen. Schwer zu erklären, es zeigt sich halt ein schwarzer Rand trotz Colorkeying.

bei Antwort benachrichtigen
Dreamforger IDE-ATAPI „ n Abend, so spät noch wach? : An dem liegts nicht, auch wenn ich sie in der...“
Optionen

Klingt für mich nach einem Verständnissfehler deinerseits: Durch Colorkeying erreichst du keine weichen Transparenzübergänge. Die Pixel sind entweder Transparent oder Opaque. Wenn du jetzt Schwarz als Transparenzfarbe definierst und dann das BMP zum Rand hin gegen Schwarz laufen lässt, wirst du immer einen schwarzen Rand haben. Dieser Rand ist nicht wirklich Schwarz im Sinne von RGB(0,0,0) sondern nur sehr sehr dunkel.

bei Antwort benachrichtigen
PaoloP IDE-ATAPI „DX7 und DirectDraw-Antialiasing“
Optionen

Ich kenne dieses Problem mit Alpha-Blending und Direct3D.
Hat die Bitmap und Surface usw. eplizite Grössenangaben mitbekommen ?
Weg 1: Poste mal den Code
Weg 2: Such Dir ein Tutorial im Internet und schau was da anders ist .. obwohl es schwierig ist noch was zu DD7 zu finden wahrscheinlich. Wie gesagt am besten den Code posten.

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
IDE-ATAPI PaoloP „Ich kenne dieses Problem mit Alpha-Blending und Direct3D. Hat die Bitmap und...“
Optionen

Hier der Code:

Geladen wird das Bitmap mit Hilfe von DDLoadBitmapFromDisk
(ist ne Standardfunktion aus der DirectX SDK ddutil)

extern "C" IDirectDrawSurface7*
DDLoadBitmapFromDisk( IDirectDraw7* pdd, LPCSTR szBitmap, int dx, int dy)
{
HBITMAP hbm;
BITMAP bm;
DDSURFACEDESC2 ddsd;
IDirectDrawSurface7 *pdds;

// Try to load the bitmap as a resource, if that fails, try it as a file
hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx,
dy, LR_CREATEDIBSECTION);
if (hbm == NULL)
hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if (hbm == NULL)
return NULL;
// Get size of the bitmap
GetObject(hbm, sizeof(bm), &bm);
// Create a DirectDrawSurface for this bitmap
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = bm.bmWidth;
ddsd.dwHeight = bm.bmHeight;
if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK)
return NULL;
DDCopyBitmap(pdds, hbm, 0, 0, 0, 0);
DeleteObject(hbm);
return pdds;
}

In der DDLoadBitmapFromDisk wird ausserdem noch DDCopyBitmap,
auch aus der SDK, aufgerufen:
extern "C" HRESULT
DDCopyBitmap(IDirectDrawSurface7* pdds, HBITMAP hbm, int x, int y,
int dx, int dy)
{
HDC hdcImage;
HDC hdc;
BITMAP bm;
DDSURFACEDESC2 ddsd;
HRESULT hr;

if (hbm == NULL || pdds == NULL)
return E_FAIL;

pdds->Restore();
// Select bitmap into a memoryDC so we can use it.
hdcImage = CreateCompatibleDC(NULL);
if (!hdcImage)
OutputDebugString("createcompatible dc failed\n");
SelectObject(hdcImage, hbm);
// Get size of the bitmap
GetObject(hbm, sizeof(bm), &bm);
dx = dx == 0 ? bm.bmWidth : dx; // Use the passed size, unless zero
dy = dy == 0 ? bm.bmHeight : dy;
// Get size of surface.
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
pdds->GetSurfaceDesc(&ddsd);
if ((hr = pdds->GetDC(&hdc)) == DD_OK)
{
StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y,
dx, dy, SRCCOPY);
pdds->ReleaseDC(hdc);
}
DeleteDC(hdcImage);
return hr;
}

Dann verpasse ich dem Bitmap noch einen Colorkey:
void AddColorKey (LPDIRECTDRAWSURFACE7 surface, DWORD Low, DWORD High) // Colorkey routine
{
DDCOLORKEY key;
ZeroMemory(&key, sizeof(key));
key.dwColorSpaceLowValue = Low;
key.dwColorSpaceHighValue = High;
surface->SetColorKey (DDCKEY_SRCBLT, &key);
}

und blitte es mit Hilfe von:
lpddsBack->Blt(&rectbitmap, lpddsBitmap, NULL, DDBLT_KEYSRC | DDBLT_WAIT, NULL);

Zu den Größenangaben:
Ich lade das Bild mit der Größe X -> 47 und Y -> 21,
das Problem tritt aber auch auf wenn ich es jetzt mit
der gleichen Größenangabe blitte.

Thx,

IDE-ATAPI

bei Antwort benachrichtigen
Dreamforger IDE-ATAPI „Hier der Code: Geladen wird das Bitmap mit Hilfe von DDLoadBitmapFromDisk ist ne...“
Optionen

Das das Bild verschwimmt kann in deinem Code eigentlich nur in der DDCopyBitmap(*) beim aufruf von StretchBlt(*) passieren. Ich hab zwar keinen Hinweis darauf in der Doc gefunden, ich halte es jedoch nicht für unmöglich das die Bilder selbst bei identischem source und dest bilinear gefiltert werden.

bei Antwort benachrichtigen
PaoloP IDE-ATAPI „Hier der Code: Geladen wird das Bitmap mit Hilfe von DDLoadBitmapFromDisk ist ne...“
Optionen

Hallo

Sorry, ich hab's ganz vergessen das hier noch was war ;-)
Hmm sieht eigentlich alles unverdächtig(auf den kurzen Blick) aus.
Allerdings fällt mir auf das da StretchBlt verwendet wird was mich sofort stutzig werden lässt da ich es dafür noch nie verwendet habe. Hier mal eine alternative Funktion die getestet ist und funktioniert allerdings setzt sie globale Schnitstellenzeiger für DD voraus, das müsstest Du evtl. noch anpassen. Komplettes Beispielprojekt gibts via E-Mail. Musst nur sagen wohin.

LPDIRECTDRAWSURFACE7 Load_Bitmap_In_Surface(LPCTSTR file_name, RECT*dims=NULL)
{
HDC hdc;
HBITMAP bit;
LPDIRECTDRAWSURFACE7 surf;
bit=(HBITMAP) LoadImage(NULL,file_name,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
if(!bit) return NULL;

BITMAP bitmap;
GetObject( bit, sizeof(BITMAP), &bitmap );
int surf_width=bitmap.bmWidth;
int surf_height=bitmap.bmHeight;

HRESULT ddrval;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(DDSURFACEDESC2);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT ;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = surf_width;
ddsd.dwHeight = surf_height;

ddrval=lpDD->CreateSurface(&ddsd,&surf,NULL);
if (ddrval!=DD_OK)
{
DeleteObject(bit);
return NULL;
}
else
{
surf->GetDC(&hdc);
HDC bit_dc=CreateCompatibleDC(hdc);
SelectObject(bit_dc,bit);
BitBlt(hdc,0,0,surf_width,surf_height,bit_dc,0,0,SRCCOPY);
surf->ReleaseDC(hdc);
DeleteDC(bit_dc);
if (dims)
{
dims->left=0;
dims->top=0;
dims->right=surf_width;
dims->bottom=surf_height;
}
}

DeleteObject(bit);
return surf;
}

Gruß

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
IDE-ATAPI Nachtrag zu: „DX7 und DirectDraw-Antialiasing“
Optionen

Danke für die vielen Antworten.
Muss mich korrigieren, das Filtern geschieht nicht wenn die Größenangaben übereinstimmen,
war ein Bug in meinem Source. (dest.Blit war um ein Pixel größer als der source.blit).

Trotzdem finde ich's störend dass beim Vergrößern der Blits gefiltet wird,
sonst hätte man ziemlich easy 'ne Zoom Funktion erstellen können. Kann man nix machen,

fröhliches coden euch alle

IDE-ATAPI

bei Antwort benachrichtigen
PaoloP IDE-ATAPI „DX7 und DirectDraw-Antialiasing“
Optionen

Kann ich das VC++ Projekt als ganzes mal haben?
Kannst ja alles rausnehmen bis auf eben das.
Dann kann ich eben mal richtig schauen, jetzt will ich es nämlich wissen :-p

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
IDE-ATAPI Nachtrag zu: „DX7 und DirectDraw-Antialiasing“
Optionen

Na klar :)
Sag mir wohin ! Meine: Partyking@beer.com
Schickst du mir deinen oben erwähnten Code auch?

IDE-ATAPI

bei Antwort benachrichtigen