Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 3.0.2] Kopiowanie sf::Image wraz z kanałem alfa do schowka

Ostatnio zmodyfikowano dzisiaj: 6h » 11 min
Autor Wiadomość
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 alfa
C/C++
bool 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"; // tu  sie włącza
       
       
if( h == 0 ) std::cout << " h is 0\n"; // tu  sie włącza
       
       
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; // B
           
dstRow[ 4 * x + 1 ] = g; // G
           
dstRow[ 4 * x + 2 ] = r; // R
           
dstRow[ 4 * x + 3 ] = a; // A
       
}
    }
   
   
GlobalUnlock( hMem );
   
   
if( !OpenClipboard( nullptr ) ) {
       
GlobalFree( hMem );
       
return false;
   
}
   
EmptyClipboard();
   
   
if( !SetClipboardData( CF_DIB, hMem ) ) {
       
CloseClipboard();
       
GlobalFree( hMem );
       
return false;
   
}
   
CloseClipboard();
   
   
   
return true;
}
P-183408
« 1 »
  Strona 1 z 1