/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
tegning af bitmap / dib
Fra : Troels Thomsen


Dato : 09-03-02 20:11

Hej

Jeg vil gerne tegne en bitmap i en 'static' i mit MFC program. Ex1 virker,
men billedet er grynet, idet det ser ud som om der kun bliver benyttet
ganske få farver.
Jeg så noget vedr dette på codeguru.com, og prøvede at lave en
halvtonepalette og selecte den ind i dc'en, men det sker ikke, da
maskeneriet ikke tror at dette understøttes. Argumentet til if() sætningen
er ihvertfald FALSE.

I Ex2 prøver jeg at lave en Cbitmap, selecte den ind i en memDc, og tegne
den. Men her kommer der slet ikke noget på skærmen.

Hjælp !!!

Programmet er en SDI/formview app
m_staticbmp er en static på formview panelet.
Dib24 er en pointer til billedet der allerede er allokeret og loaded (af en
dll jeg ikke har skrevet)
xmax, ymax er billedestørrelsen (1280x1024)


Ex1:
-----
void CTest4View::DrawDib24()
{
Xmax = 1280; Ymax = 1024 ;
BITMAPINFO myBmpInfo24 ;
myBmpInfo24.bmiHeader.biSize = sizeof(BITMAPINFO);
myBmpInfo24.bmiHeader.biWidth = Xmax ;
myBmpInfo24.bmiHeader.biHeight = Ymax ;
myBmpInfo24.bmiHeader.biPlanes = 1 ;
myBmpInfo24.bmiHeader.biBitCount = 24 ;
myBmpInfo24.bmiHeader.biCompression = BI_RGB ;
myBmpInfo24.bmiHeader.biSizeImage = 0 ;
myBmpInfo24.bmiHeader.biXPelsPerMeter = 1000 ;
myBmpInfo24.bmiHeader.biYPelsPerMeter = 1000 ;
myBmpInfo24.bmiHeader.biClrUsed = 0 ;
myBmpInfo24.bmiHeader.biClrImportant = 0 ;

CRect myRect;
m_staticbmp.GetWindowRect(&myRect);
CPalette pal;
CDC* pdc = m_staticbmp.GetDC() ;
HDC hdc = pdc->GetSafeHdc() ;

pal.CreateHalftonePalette( pdc );

if (pdc->GetDeviceCaps( RASTERCAPS ) & RC_PALETTE && pal.m_hObject != NULL)
{
// Dette køres aldrig ....
pdc->SelectPalette(&pal,FALSE);
pdc->RealizePalette();
}

// OK så tegner vi !!! Dette virker rent faktisk, men bliver som nævnt
grynet
StretchDIBits( hdc,
0 , 0 ,
myRect.Width(), myRect.Height(),
0 , 0 , Xmax, Ymax ,
Dib24 , &myBmpInfo24 ,
DIB_PAL_COLORS , SRCCOPY ) ;
}



Ex2:
-----
void CTest4View::DrawDib24_2()
{
int ret ;

CBitmap bmp ;
ret = bmp.CreateBitmap( 1280, 1024, 1, 24, Dib24 );

CDC* pdc = m_staticbmp.GetDC() ;
HDC hdc = pdc->GetSafeHdc() ;

CPalette pal ;
pal.CreateHalftonePalette( pdc );

CDC memDC;
memDC.CreateCompatibleDC( pdc );

memDC.SelectObject( &bmp );

if (pdc->GetDeviceCaps( RASTERCAPS ) & RC_PALETTE && pal.m_hObject != NULL)
{
pdc->SelectPalette(&pal,FALSE);
ret = pdc->RealizePalette();
}

pdc->BitBlt(0, 0, 1280, 1024, &memDC, 0, 0,SRCCOPY);
}






 
 
Thomas Krog (10-03-2002)
Kommentar
Fra : Thomas Krog


Dato : 10-03-02 00:52

Jeg vil tro det letteste er at indstille din m_staticbmp til at være et 24
bit billede(*) og droppe paletterne. 8 bit farvebilleder er et forældet
format der er langt mere besværligt at arbejde med end 16 eller 24 bit. Det
er unødvendigt at bøvle med pga. de kraftige grafikkort der findes idag.

(*) Hvordan du gør dette kan du nok få at vide på en af nyhedsgrupperne:
microsoft.public.vc.mfc
eller
microsoft.public.vc.language



Kent Friis (10-03-2002)
Kommentar
Fra : Kent Friis


Dato : 10-03-02 09:12

Den Sun, 10 Mar 2002 00:51:43 +0100 skrev Thomas Krog:
>Jeg vil tro det letteste er at indstille din m_staticbmp til at være et 24
>bit billede(*) og droppe paletterne. 8 bit farvebilleder er et forældet
>format der er langt mere besværligt at arbejde med end 16 eller 24 bit. Det
>er unødvendigt at bøvle med pga. de kraftige grafikkort der findes idag.

Der findes stadig grafikkort der kun vil køre med 8bit - jeg brugte et
indtil fornylig. Men selv på 8bit grafikkort, bruger man normalt en
24bit bitmap, og venter med at konvertere til det skal vises på skærmen.

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/ - Ny tegning uploadet.

Troels Thomsen (10-03-2002)
Kommentar
Fra : Troels Thomsen


Dato : 10-03-02 17:08

Hej

Det viste sig at det så perfekt ud da jeg prøvede kun at tegne 100x100
pixels (ud af 1280x1024) op på skærmen.
Det var først når jeg skalerede den (stretchDIBit/stretchBlt) det gik galt.
Derfor prøver jeg nu at
kalde :
HDC hdc = m_staticbmp.GetDC()->GetSafeHdc();
SetStretchBltMode ( hdc , HALFTONE );
SetBrushOrgEx( hdc , 0 , 0 , &prevPoint); // det står der at man skal
.....
StretchBlt( hdc, 0 , 0 , etc etc etc

jeg synes dog ikke der er forskel . . .
nogen ideer ????




"Kent Friis" <kfr@fleggaard.dk> wrote in message
news:a6f4gr$bjr$1@sunsite.dk...
> Den Sun, 10 Mar 2002 00:51:43 +0100 skrev Thomas Krog:
> >Jeg vil tro det letteste er at indstille din m_staticbmp til at være et
24
> >bit billede(*) og droppe paletterne. 8 bit farvebilleder er et forældet
> >format der er langt mere besværligt at arbejde med end 16 eller 24 bit.
Det
> >er unødvendigt at bøvle med pga. de kraftige grafikkort der findes idag.
>
> Der findes stadig grafikkort der kun vil køre med 8bit - jeg brugte et
> indtil fornylig. Men selv på 8bit grafikkort, bruger man normalt en
> 24bit bitmap, og venter med at konvertere til det skal vises på skærmen.
>
> Mvh
> Kent
> --
> http://www.celebrityshine.com/~kfr/ - Ny tegning uploadet.





Thomas Krog (10-03-2002)
Kommentar
Fra : Thomas Krog


Dato : 10-03-02 18:39

> SetStretchBltMode ( hdc , HALFTONE );

Det er formodentlig ovenstående linje der giver problemet. HALFTONE betyder
at billedet bliver udglattet når der forstørres så "trapperne" ikke er så
tydelige. Dette kræver praktisk talt altid nogle andre farver end dem der
ligger på kildebilledet og din 8 bit palette får derfor problemer. Problemet
kan løses på tre måder:
-skift til 16 eller 24 bit
-lav paletten _efter_ du har stretchet (kræver et ekstra bmp)
-undlad at bruge HALFTONE (jeg vil tro COLORONCOLOR laver en almindelig kopi
men jeg har ikke prøvet)



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste