[SFML 3.0.2] Kopiowanie sf::Image wraz z kanałem alfa do schowka
Ostatnio zmodyfikowano dzisiaj: 6h » 11 min
tBane Temat założony przez niniejszego użytkownika |
[SFML 3.0.2] Kopiowanie sf::Image wraz z kanałem alfa do schowka » 2025-11-07 12:29:17 Witam. Jak skopiować sf::Image wraz z kanałem alfa (przezroczystością) do schowka systemowego? Mam kod ale nie obsługuje kanału alfa :-/ Kopioweanie bez kanału alfabool copyImageToClipboard( sf::Image & image, sf::IntRect rect ) { if( image.getSize().x == 0 || image.getSize().y == 0 ) { return false; } int x0 = std::clamp( rect.position.x, 0, int( image.getSize().x ) ); int y0 = std::clamp( rect.position.y, 0, int( image.getSize().y ) ); int x1 = std::clamp( rect.position.x + rect.size.x, 0, int( image.getSize().x ) ); int y1 = std::clamp( rect.position.y + rect.size.y, 0, int( image.getSize().y ) ); std::wcout << x0 << "\n"; std::wcout << y0 << "\n"; std::wcout << x1 << "\n"; std::wcout << y1 << "\n"; const unsigned int w =( x1 > x0 ) ? unsigned( x1 - x0 ) : 0u; const unsigned int h =( y1 > y0 ) ? unsigned( y1 - y0 ) : 0u; sf::IntRect r( { 0, 0 }, { int( image.getSize().x ), int( image.getSize().y ) } ); if( !rect.findIntersection( r ).has_value() || w == 0 || h == 0 ) { if( w == 0 ) std::cout << " w is 0\n"; if( h == 0 ) std::cout << " h is 0\n"; return false; } const uint8_t * pixels = image.getPixelsPtr(); BITMAPINFOHEADER bi { }; bi.biSize = sizeof( BITMAPINFOHEADER ); bi.biWidth = LONG( w ); bi.biHeight = - LONG( h ); bi.biPlanes = 1; bi.biBitCount = 32; bi.biCompression = BI_RGB; const SIZE_T pixelBytes = SIZE_T( w ) * SIZE_T( h ) * 4; HGLOBAL hMem = GlobalAlloc( GHND, sizeof( BITMAPINFOHEADER ) + pixelBytes ); if( !hMem ) return false; void * pMem = GlobalLock( hMem ); auto * pHeader = static_cast < BYTE * >( pMem ); auto * dstPixels = pHeader + sizeof( BITMAPINFOHEADER ); std::memcpy( pHeader, & bi, sizeof( BITMAPINFOHEADER ) ); for( unsigned int y = 0; y < h; ++y ) { const uint8_t * srcRow = pixels +(( y0 + y ) * image.getSize().x + x0 ) * 4; uint8_t * dstRow = dstPixels +( y * w ) * 4; for( unsigned int x = 0; x < w; ++x ) { const uint8_t r = srcRow[ 4 * x + 0 ]; const uint8_t g = srcRow[ 4 * x + 1 ]; const uint8_t b = srcRow[ 4 * x + 2 ]; const uint8_t a = srcRow[ 4 * x + 3 ]; dstRow[ 4 * x + 0 ] = b; dstRow[ 4 * x + 1 ] = g; dstRow[ 4 * x + 2 ] = r; dstRow[ 4 * x + 3 ] = a; } } GlobalUnlock( hMem ); if( !OpenClipboard( nullptr ) ) { GlobalFree( hMem ); return false; } EmptyClipboard(); if( !SetClipboardData( CF_DIB, hMem ) ) { CloseClipboard(); GlobalFree( hMem ); return false; } CloseClipboard(); return true; }
|
|
| « 1 » |