Newsgroup: it.comp.programmare.win32
Titolo: SetPixelV() e GetPixel()

ho fatto dei benchmark sulla mia applicazione AlphaSplash
la media è di 81.000 pixel al secondo
se elimino la routine dell'interpolazione lineare, e cioè blitto il pixel
che leggo scende solamente a 71.000 pixel al secondo
quindi tutta questa lentezza è colpa di SetPixel() (o SetPixelV()) e
GetPixel() che sono terribilmente lenti
tempo fa mi è stato consigliato di usare SetDIBits() e GetDIBits(), ma non
so nè come si usano nè cosa fanno
per caso (da quel poco che sono riuscito a leggere) copiano i pixel in
un'array bidimensionale di tipo RGBQUAD?
mi servirebbe un esempio
grazie
--
ciao
..::[xaero]::..

 ha scritto nel messaggio
news:8vh990$4ou56$1...@ID-51253.news.dfncis.de...

Qui sotto e' riportato un breve stralcio di un'applicazione che cambia
il colore dei pixels di una bitmap da nero a blu:
[...]
      case WM_CREATE :
               {
                  HDC    hDC, hMemDC;
                  LPTSTR lpstBitmap;
                  hDC = GetDC (hWnd) ;
                  // Intialize BITMAPINFOHEADER data.
                  //.................................
                  bi.biSize     = sizeof (BITMAPINFOHEADER) ;
                  bi.biWidth    = WIDTH;
                  bi.biHeight   = HEIGHT;
                  bi.biPlanes   = 1;
                  bi.biBitCount = COLORBITS;
                  bi.biCompression = BI_RGB;
                  bi.biSizeImage = ( ALIGNLONG( (WIDTH * COLORBITS)/8 )
                                         * HEIGHT);
                  bi.biXPelsPerMeter = 0;
                  bi.biYPelsPerMeter = 0;
                  bi.biClrUsed       = 0;
                  bi.biClrImportant  = 0;
                  // Create uninitialized DIB bitmap.
                  //.................................
                  hBitmap = CreateDIBitmap( hDC, &bi, 0L, NULL,
                                            NULL, 0);
                  // Allocate memory for BITMAPINFO structure.
                  //..........................................
                  lpbi = (BITMAPINFOHEADER*)GlobalAlloc( GPTR,
                                       sizeof(BITMAPINFOHEADER) +
                                       16 * sizeof (RGBQUAD) +
                                       (ALIGNLONG((WIDTH * COLORBITS)/8)
                                       * HEIGHT) );
                  // Copy BITMAPINFOHEADER information.
                  //...................................
                  *lpbi = bi;
                  // Initialize structure data with GetDIBits().
                  //............................................
                  GetDIBits( hDC, hBitmap, 0, 50, NULL,
                            (LPBITMAPINFO) lpbi, DIB_RGB_COLORS);
                  // Create memory device context and select bitmap.
                  //................................................
                  hMemDC = CreateCompatibleDC( hDC );
                  SelectObject( hMemDC, hBitmap );
                  // Paint on memory device context.
                  //................................
                  SelectObject( hMemDC, GetStockObject(BLACK_BRUSH) );
                  Rectangle (hMemDC, 0, 0, WIDTH, HEIGHT);
                  SelectObject( hMemDC, GetStockObject(WHITE_BRUSH) ) ;
                  Ellipse( hMemDC, 0, 0, WIDTH, HEIGHT );
                  MoveToEx( hMemDC, 0, 0, NULL );
                  LineTo( hMemDC, WIDTH / 2, HEIGHT / 2 );
                  LineTo( hMemDC, WIDTH, 0 );
                  // Set pointer to bitmap's bit data.
                  //..................................
                  lpstBitmap = (LPSTR)lpbi + (WORD)sizeof(BITMAPINFOHEADER)
+
                                             (16 * sizeof(RGBQUAD));
                  GetDIBits( hDC, hBitmap, 0, HEIGHT, lpstBitmap,
                             (LPBITMAPINFO) lpbi, DIB_RGB_COLORS);
                  DeleteDC( hMemDC );
                  ReleaseDC( hWnd, hDC);
               }
               break;
      case WM_PAINT :
               {
                  PAINTSTRUCT ps;
                  HDC         hMemDC;
                  BeginPaint( hWnd, &ps );
                  hMemDC = CreateCompatibleDC( ps.hdc );
                  SelectObject( hMemDC, hBitmap );
                  BitBlt( ps.hdc, 10, 10, WIDTH, HEIGHT,
                          hMemDC, 0, 0, SRCCOPY );
                  DeleteDC( hMemDC );
                  EndPaint( hWnd, &ps );
               }
               break;
      case WM_COMMAND :
              switch( LOWORD( wParam ) )
              {
                 case IDM_TEST :
                        {
                           HDC    hDC;
                           int    nBytes, i;
                           LPTSTR lpstBitmap, lpstTemp;
                           hDC = GetDC( hWnd );
                           lpstBitmap = (LPSTR)lpbi +
                                        (WORD) sizeof(BITMAPINFOHEADER) +
                                         (16 * sizeof (RGBQUAD));
                           nBytes = ALIGNLONG((WIDTH * COLORBITS)/8)
                                    * HEIGHT;
                           lpstTemp = lpstBitmap;
                           // Change 0 bytes to 0x2C in bitmap data.
                           //........................................
                           for( i = 0; i < nBytes; i++ )
                           {
                              if ( 0 == *lpstTemp )
                                 *lpstTemp = 0x2C;
                              lpstTemp++;
                           }
                           // Make the changes to the bitmap.
                           //................................
                           SetDIBits( hDC, hBitmap, 0, HEIGHT, lpstBitmap,
                                      (LPBITMAPINFO) lpbi, DIB_RGB_COLORS );
                           ReleaseDC( hWnd, hDC );
                           InvalidateRect( hWnd, NULL, TRUE );
                           UpdateWindow( hWnd );
                        }
                        break;
L'applicazione completa la puoi trova in e-mail.
Ciao.
Il Michett@
--