Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
Hello! In R23 we got an interesting feature to play with, but there is not much of an info about how to use it properly. Im talking about BaseDraw::GetViewportImage().
This is what i tried.
AutoAlloc<BaseBitmap> bmp; maxon::ImageRef imgr = maxon::ImageClasses::IMAGE().Create() iferr_return; const maxon::PixelFormat rgbFormat = maxon::PixelFormats::RGB::U8(); const auto storageType = maxon::ImagePixelStorageClasses::Normal(); imgr.Init(optW, optH, storageType, rgbFormat) iferr_return; bmp->Init(optW, optH); bmp->GetImageRef(SAVEBIT::NONE, true, imgr); doc->GetActiveBaseDraw()->GetViewportImage(imgr); ShowBitmap(bmp);
Bitmap is just black, which leads me to conclusion that im using it the wrong way. How to use this new function properly and save to bitmap?
hi,
bmp->GetImageRef will retrieve the imageRef used internally.
this is how it's done internally. You have to transfert the data from the imageRef to the bitmap.
BaseDraw* bd = doc->GetActiveBaseDraw(); CheckState(bd); // Get the viewport image from the viewport renderer maxon::ImageRef img; bd->GetViewportImage(img); if (img == nullptr) return maxon::NullptrError(MAXON_SOURCE_LOCATION); // Transform ImageRef to BaseBitmap in order to show it in the PictureViewer const Int w = img.GetWidth(); const Int h = img.GetHeight(); AutoAlloc<BaseBitmap> bitmap; CheckState(bitmap); maxon::PixelFormat rgbf = img.GetPixelFormat(); Int32 bitsPerColor = (Int32)(rgbf.GetBitsPerPixel().Get() / rgbf.GetChannelCount()); bitmap->Init((Int32)w, (Int32)h, bitsPerColor == 32 ? 96 : 32); maxon::BaseArray<UChar> line; line.Resize(w * rgbf.GetBitsPerPixel().GetBytes()) iferr_return; maxon::PixelMutableBuffer imageBuffer(line.GetFirst(), rgbf.GetBitsPerPixel()); maxon::GetPixelHandlerStruct getpixel = img.GetPixelHandler(rgbf, rgbf.GetChannelOffsets(), maxon::ColorProfile(), maxon::GETPIXELHANDLERFLAGS::NONE, nullptr) iferr_return; for (Int y = 0; y < h; y++) { getpixel.GetPixel(maxon::ImagePos(0, y, w), imageBuffer, maxon::GETPIXELFLAGS::NONE) iferr_return; bitmap->SetPixelCnt(0, (Int32)y, (Int32)w, line.GetFirst(), (Int32)rgbf.GetBitsPerPixel().GetBytes(), bitsPerColor == 32 ? COLORMODE::RGBf : COLORMODE::RGB, PIXELCNT::NONE); } ShowBitmap(bitmap);
Cheers, Manuel
@m_magalhaes Thanks a lot! That makes things clear.