sciter-sdk/rust-sciter

Image::with_data( ) always say "Access violation"

Donald2010 opened this issue · 2 comments

I’ve got a pointer hbitmap of type winapi::um::wingdi::BITMAP, and want to convert it to sciter::graphics::Image:
let s =std::slice::from_raw_parts(hbitmap as *mut BYTE, (width*height*4) as usize); // convert hbitmap to &[u8]
let img = sciter::graphics::Image::with_data((width, height), false, s);

When debugging, it gave error "unhandled exception. 0xC0000005: Access violation" at this line
let ok = (_GAPI.imageCreateFromPixmap)(&mut h, width, height, with_alpha as BOOL, pixmap.as_ptr());
in Image::with_data( ) function.

The hbitmap is obtained this way
let handle = GetDesktopWindow();
let mut HDC_screen = um::winuser::GetDC(handle);
let mut HDC_compatible_DC = um::wingdi::CreateCompatibleDC(HDC_screen);
let hbitmap = um::wingdi::CreateCompatibleBitmap(HDC_screen, width, height);
let my_bit_blt = um::wingdi::BitBlt(HDC_compatible_DC, 0, 0, width, height, HDC_screen, 0, 0, um::wingdi::SRCCOPY|um::wingdi::CAPTUREBLT);

I 'm ont sure the error is caused by the type conversion of bitmap to &[u8], or the function Image::with_data( ) itself.
Do you have any idea ?

Image::with_data expects data in BGRA format. But HBITMAP is a handle, not data. See GetObject and GetDIBits instead.

Check an MSDN example on how to capture a desktop image.

Also, in Sciter.TIS there's View.screenBox(monitorIndex, #snapshot) which gives you a captured Image in script. In Sciter.JS there's Window.this.screenBox("snapshot") with the same purpose, but it gives the current monitor only.

Looks like you've got an answer in forums as well: https://sciter.com/forums/topic/how-to-get-image-from-hbitmap/

Closing for now.