本文整理汇总了C++中imf::FrameBuffer类的典型用法代码示例。如果您正苦于以下问题:C++ FrameBuffer类的具体用法?C++ FrameBuffer怎么用?C++ FrameBuffer使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了FrameBuffer类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: readPixelsImpl
void CqExrInputFile::readPixelsImpl(TqUint8* buffer,
TqInt startLine, TqInt numScanlines) const
{
// correct the start line for OpenEXR conventions
const Imath::Box2i& dataWindow = m_exrFile->header().dataWindow();
startLine += dataWindow.min.y;
// Set up an OpenEXR framebuffer
Imf::FrameBuffer frameBuffer;
const CqChannelList& channels = m_header.channelList();
const TqChannelNameMap& nameMap = m_header.find<Attr::ExrChannelNameMap>();
const TqInt xStride = channels.bytesPerPixel();
const TqInt yStride = m_header.width()*xStride;
// In OpenEXR, the buffer base pointer is assumed to point at the
// coordinates of the (0,0) pixel. We need to correct our buffer pointer
// by subtracting the offset to (0,0) from the start of the data.
buffer -= dataWindow.min.x*xStride + dataWindow.min.y*yStride;
for(TqInt i = 0; i < channels.numChannels(); ++i)
{
frameBuffer.insert(nameMap.find(channels[i].name)->second.c_str(),
Imf::Slice(
exrChannelType(channels[i].type),
reinterpret_cast<char*>(buffer + channels.channelByteOffset(i)),
xStride,
yStride
)
);
}
m_exrFile->setFrameBuffer(frameBuffer);
// Read in the pixels
m_exrFile->readPixels(startLine, startLine + numScanlines - 1);
}
示例2: save
void Bitmap::save(const std::string &filename) {
cout << "Writing a " << cols() << "x" << rows()
<< " OpenEXR file to \"" << filename << "\"" << endl;
Imf::Header header((int) cols(), (int) rows());
header.insert("comments", Imf::StringAttribute("Generated by Nori"));
Imf::ChannelList &channels = header.channels();
channels.insert("R", Imf::Channel(Imf::FLOAT));
channels.insert("G", Imf::Channel(Imf::FLOAT));
channels.insert("B", Imf::Channel(Imf::FLOAT));
Imf::FrameBuffer frameBuffer;
size_t compStride = sizeof(float),
pixelStride = 3 * compStride,
rowStride = pixelStride * cols();
char *ptr = reinterpret_cast<char *>(data());
frameBuffer.insert("R", Imf::Slice(Imf::FLOAT, ptr, pixelStride, rowStride)); ptr += compStride;
frameBuffer.insert("G", Imf::Slice(Imf::FLOAT, ptr, pixelStride, rowStride)); ptr += compStride;
frameBuffer.insert("B", Imf::Slice(Imf::FLOAT, ptr, pixelStride, rowStride));
Imf::OutputFile file(filename.c_str(), header);
file.setFrameBuffer(frameBuffer);
file.writePixels((int) rows());
}
示例3: write_half_exr
void write_half_exr( const boost::filesystem::path& p, Imf::Header& header,
const image::const_image_view_t& view, bool write_alpha)
{
boost::gil::rgba16f_image_t img( view.width(), view.height());
boost::gil::copy_and_convert_pixels( view, boost::gil::view( img));
header.channels().insert( "R", Imf::HALF);
header.channels().insert( "G", Imf::HALF);
header.channels().insert( "B", Imf::HALF);
if( write_alpha)
header.channels().insert( "A", Imf::HALF);
Imf::FrameBuffer frameBuffer;
char *ptr = (char *) boost::gil::interleaved_view_get_raw_data( boost::gil::view( img));
std::size_t xstride = 4 * sizeof(half);
std::size_t ystride = xstride * img.width();
frameBuffer.insert( "R", Imf::Slice( Imf::HALF, ptr, xstride, ystride)); ptr += sizeof(half);
frameBuffer.insert( "G", Imf::Slice( Imf::HALF, ptr, xstride, ystride)); ptr += sizeof(half);
frameBuffer.insert( "B", Imf::Slice( Imf::HALF, ptr, xstride, ystride)); ptr += sizeof(half);
if( write_alpha)
frameBuffer.insert( "A", Imf::Slice( Imf::HALF, ptr, xstride, ystride));
Imf::OutputFile out_file( p.external_file_string().c_str(), header);
out_file.setFrameBuffer( frameBuffer);
out_file.writePixels( img.height());
}
示例4: writeImage
bool ImageIO::writeImage(QVector<float> &pixels, const QString &filePath, const LayerDesc &desc, int width, int height)
{
try
{
Imf::Header header (width, height);
Imf::FrameBuffer frameBuffer;
for (int chan = 0; chan < desc.numChannels(); chan++) {
QString chan_name = QString("%1.%2").arg(desc._layer_name).arg(desc._channels[chan]);
header.channels().insert(qPrintable(chan_name), Imf::Channel(Imf::FLOAT));
frameBuffer.insert(qPrintable(chan_name), Imf::Slice(Imf::FLOAT, (char *) pixels.data() + chan*sizeof(float), sizeof(float)*desc.numChannels(), sizeof(float)*width*desc.numChannels()));
}
Imf::OutputFile file(qPrintable(remapFilePath(filePath)), header);
file.setFrameBuffer(frameBuffer);
file.writePixels(height);
}
catch (const std::exception &e)
{
qWarning() << e.what();
return false;
}
return true;
}
示例5: clamp
bool
OpenEXRInput::read_native_scanlines (int ybegin, int yend, int z,
int chbegin, int chend, void *data)
{
chend = clamp (chend, chbegin+1, m_spec.nchannels);
// std::cerr << "openexr rns " << ybegin << ' ' << yend << ", channels "
// << chbegin << "-" << (chend-1) << "\n";
if (m_input_scanline == NULL && m_scanline_input_part == NULL) {
error ("called OpenEXRInput::read_native_scanlines without an open file");
return false;
}
// Compute where OpenEXR needs to think the full buffers starts.
// OpenImageIO requires that 'data' points to where the client wants
// to put the pixels being read, but OpenEXR's frameBuffer.insert()
// wants where the address of the "virtual framebuffer" for the
// whole image.
const PartInfo &part (m_parts[m_subimage]);
size_t pixelbytes = m_spec.pixel_bytes (chbegin, chend, true);
size_t scanlinebytes = (size_t)m_spec.width * pixelbytes;
char *buf = (char *)data
- m_spec.x * pixelbytes
- ybegin * scanlinebytes;
try {
Imf::FrameBuffer frameBuffer;
size_t chanoffset = 0;
for (int c = chbegin; c < chend; ++c) {
size_t chanbytes = m_spec.channelformat(c).size();
frameBuffer.insert (m_spec.channelnames[c].c_str(),
Imf::Slice (part.pixeltype[c],
buf + chanoffset,
pixelbytes, scanlinebytes));
chanoffset += chanbytes;
}
if (m_input_scanline) {
m_input_scanline->setFrameBuffer (frameBuffer);
m_input_scanline->readPixels (ybegin, yend-1);
#ifdef USE_OPENEXR_VERSION2
} else if (m_scanline_input_part) {
m_scanline_input_part->setFrameBuffer (frameBuffer);
m_scanline_input_part->readPixels (ybegin, yend-1);
#endif
} else {
error ("Attempted to read scanline from a non-scanline file.");
return false;
}
} catch (const std::exception &e) {
error ("Failed OpenEXR read: %s", e.what());
return false;
} catch (...) { // catch-all for edge cases or compiler bugs
error ("Failed OpenEXR read: unknown exception");
return false;
}
return true;
}
示例6: file
NORI_NAMESPACE_BEGIN
Bitmap::Bitmap(const std::string &filename) {
Imf::InputFile file(filename.c_str());
const Imf::Header &header = file.header();
const Imf::ChannelList &channels = header.channels();
Imath::Box2i dw = file.header().dataWindow();
resize(dw.max.y - dw.min.y + 1, dw.max.x - dw.min.x + 1);
cout << "Reading a " << cols() << "x" << rows() << " OpenEXR file from \""
<< filename << "\"" << endl;
const char *ch_r = nullptr, *ch_g = nullptr, *ch_b = nullptr;
for (Imf::ChannelList::ConstIterator it = channels.begin(); it != channels.end(); ++it) {
std::string name = toLower(it.name());
if (it.channel().xSampling != 1 || it.channel().ySampling != 1) {
/* Sub-sampled layers are not supported */
continue;
}
if (!ch_r && (name == "r" || name == "red" ||
endsWith(name, ".r") || endsWith(name, ".red"))) {
ch_r = it.name();
} else if (!ch_g && (name == "g" || name == "green" ||
endsWith(name, ".g") || endsWith(name, ".green"))) {
ch_g = it.name();
} else if (!ch_b && (name == "b" || name == "blue" ||
endsWith(name, ".b") || endsWith(name, ".blue"))) {
ch_b = it.name();
}
}
if (!ch_r || !ch_g || !ch_b)
throw NoriException("This is not a standard RGB OpenEXR file!");
size_t compStride = sizeof(float),
pixelStride = 3 * compStride,
rowStride = pixelStride * cols();
char *ptr = reinterpret_cast<char *>(data());
Imf::FrameBuffer frameBuffer;
frameBuffer.insert(ch_r, Imf::Slice(Imf::FLOAT, ptr, pixelStride, rowStride)); ptr += compStride;
frameBuffer.insert(ch_g, Imf::Slice(Imf::FLOAT, ptr, pixelStride, rowStride)); ptr += compStride;
frameBuffer.insert(ch_b, Imf::Slice(Imf::FLOAT, ptr, pixelStride, rowStride));
file.setFrameBuffer(frameBuffer);
file.readPixels(dw.min.y, dw.max.y);
m_totalLuminance = getTotalLuminace();
}
示例7: SaveExr
void SaveExr(const Image<unsigned char>& image_in, const pangolin::PixelFormat& fmt, const std::string& filename, bool top_line_first)
{
PANGOLIN_UNUSED(image_in);
PANGOLIN_UNUSED(fmt);
PANGOLIN_UNUSED(filename);
PANGOLIN_UNUSED(top_line_first);
#ifdef HAVE_OPENEXR
ManagedImage<unsigned char> flip_image;
Image<unsigned char> image;
if(top_line_first) {
image = image_in;
}else{
flip_image.Reinitialise(image_in.pitch,image_in.h);
for(size_t y=0; y<image_in.h; ++y) {
std::memcpy(flip_image.RowPtr(y), image_in.RowPtr(y), image_in.pitch);
}
image = flip_image;
}
Imf::Header header (image.w, image.h);
SetOpenEXRChannels(header.channels(), fmt);
Imf::OutputFile file (filename.c_str(), header);
Imf::FrameBuffer frameBuffer;
int ch=0;
size_t ch_bits = 0;
for(Imf::ChannelList::Iterator it = header.channels().begin(); it != header.channels().end(); ++it)
{
frameBuffer.insert(
it.name(),
Imf::Slice(
it.channel().type,
(char*)image.ptr + ch_bits/8,
fmt.channel_bits[ch]/8,
image.pitch
)
);
ch_bits += fmt.channel_bits[ch++];
}
file.setFrameBuffer(frameBuffer);
file.writePixels(image.h);
#else
throw std::runtime_error("EXR Support not enabled. Please rebuild Pangolin.");
#endif // HAVE_OPENEXR
}
示例8: SaveTexture
void SaveTexture( const std::string& _filename,
float* _data,
int _w,
int _h,
bool _verbose)
{
int xRes = _w;
int yRes = _h;
int xOffset = 0;
int yOffset = 0;
int nChannels = 4;
Imf::Header header(xRes, yRes);
Imath::Box2i dataWindow(Imath::V2i(xOffset, yOffset), Imath::V2i(xOffset + xRes - 1, yOffset + yRes - 1));
header.dataWindow() = dataWindow;
header.channels().insert("R", Imf::Channel (Imf::HALF));
header.channels().insert("G", Imf::Channel (Imf::HALF));
header.channels().insert("B", Imf::Channel (Imf::HALF));
header.channels().insert("A", Imf::Channel (Imf::HALF));
::half *hchannels = new ::half[nChannels * xRes * yRes];
for (int y = 0; y < yRes; ++y)
for (int x = 0; x < xRes; ++x)
for (int c = 0; c < nChannels; ++c)
{
int iSrc = c + x*nChannels + (yRes-1-y)*xRes*nChannels;
int iDst = c + x*nChannels + y*xRes*nChannels;
hchannels[iDst] = _data[iSrc];
}
Imf::FrameBuffer fb;
fb.insert("R", Imf::Slice(Imf::HALF, (char *)hchannels, nChannels*sizeof(::half), nChannels*xRes*sizeof(::half)));
fb.insert("G", Imf::Slice(Imf::HALF, (char *)hchannels+1*sizeof(::half), nChannels*sizeof(::half), nChannels*xRes*sizeof(::half)));
fb.insert("B", Imf::Slice(Imf::HALF, (char *)hchannels+2*sizeof(::half), nChannels*sizeof(::half), nChannels*xRes*sizeof(::half)));
fb.insert("A", Imf::Slice(Imf::HALF, (char *)hchannels+3*sizeof(::half), nChannels*sizeof(::half), nChannels*xRes*sizeof(::half)));
Imf::OutputFile file(_filename.c_str(), header);
file.setFrameBuffer(fb);
try
{
file.writePixels(yRes);
}
catch (const std::exception &e)
{
Error("Unable to write image file \"%s\": %s", _filename.c_str(), e.what());
assert(false);
}
delete[] hchannels;
}
示例9: SaveExr
void SaveExr(const Image<unsigned char>& image_in, const pangolin::VideoPixelFormat& fmt, const std::string& filename, bool top_line_first)
{
#ifdef HAVE_OPENEXR
Image<unsigned char> image;
if(top_line_first) {
image = image_in;
}else{
image.Alloc(image_in.w,image_in.h,image_in.pitch);
for(size_t y=0; y<image_in.h; ++y) {
std::memcpy(image.ptr + y*image.pitch, image_in.ptr + (image_in.h-y-1)*image_in.pitch, image.pitch);
}
}
Imf::Header header (image.w, image.h);
SetOpenEXRChannels(header.channels(), fmt);
Imf::OutputFile file (filename.c_str(), header);
Imf::FrameBuffer frameBuffer;
int ch=0;
size_t ch_bits = 0;
for(Imf::ChannelList::Iterator it = header.channels().begin(); it != header.channels().end(); ++it)
{
frameBuffer.insert(
it.name(),
Imf::Slice(
it.channel().type,
(char*)image.ptr + ch_bits/8,
fmt.channel_bits[ch]/8,
image.pitch
)
);
ch_bits += fmt.channel_bits[ch++];
}
file.setFrameBuffer(frameBuffer);
file.writePixels(image.h);
if(!top_line_first) {
image.Dealloc();
}
#else
throw std::runtime_error("EXR Support not enabled. Please rebuild Pangolin.");
#endif // HAVE_OPENEXR
}
示例10: write_rgba_layer
void ImgTools::write_rgba_layer(const char *filename, const Imf::Rgba* pixels, const Imath::Box2i &dispwin, const Imath::Box2i &datawin)
{
using namespace Imf;
const int DISP_WIDTH = dispwin.max.x - dispwin.min.x + 1;
const int DISP_HEIGHT = dispwin.max.y - dispwin.min.y + 1;
const int DATA_WIDTH = datawin.max.x - datawin.min.x + 1;
const int DATA_HEIGHT = datawin.max.y - datawin.min.y + 1;
const Imf::Rgba* BASE = pixels - datawin.min.x - datawin.min.y * DATA_WIDTH;
Imf::Header header(DISP_WIDTH, DISP_HEIGHT);
header.dataWindow() = datawin;
header.channels().insert("R", Imf::Channel(Imf::HALF));
header.channels().insert("G", Imf::Channel(Imf::HALF));
header.channels().insert("B", Imf::Channel(Imf::HALF));
header.channels().insert("A", Imf::Channel(Imf::HALF));
Imf::OutputFile exr(filename, header);
Imf::FrameBuffer frameBuffer;
frameBuffer.insert("R", // name
Imf::Slice(Imf::HALF, // type
(char *)(&BASE->r), // base
sizeof(*BASE), // xStride
sizeof(*BASE) * DATA_WIDTH)); // yStride
frameBuffer.insert("G", // name
Imf::Slice(Imf::HALF, // type
(char *)(&BASE->g), // base
sizeof(*BASE), // xStride
sizeof(*BASE) * DATA_WIDTH)); // yStride
frameBuffer.insert("B", // name
Imf::Slice(Imf::HALF, // type
(char *)(&BASE->b), // base
sizeof(*BASE), // xStride
sizeof(*BASE) * DATA_WIDTH)); // yStride
frameBuffer.insert("A", // name
Imf::Slice(Imf::HALF, // type
(char *)(&BASE->a), // base
sizeof(*BASE), // xStride
sizeof(*BASE) * DATA_WIDTH)); // yStride
exr.setFrameBuffer(frameBuffer);
exr.writePixels(DATA_HEIGHT);
}
示例11: spec
bool
OpenEXROutput::write_tile (int x, int y, int z,
TypeDesc format, const void *data,
stride_t xstride, stride_t ystride, stride_t zstride)
{
bool native = (format == TypeDesc::UNKNOWN);
size_t pixel_bytes = m_spec.pixel_bytes (native);
if (native && xstride == AutoStride)
xstride = (stride_t) pixel_bytes;
m_spec.auto_stride (xstride, ystride, zstride, format, spec().nchannels,
spec().tile_width, spec().tile_height);
data = to_native_tile (format, data, xstride, ystride, zstride, m_scratch);
// Compute where OpenEXR needs to think the full buffers starts.
// OpenImageIO requires that 'data' points to where the client wants
// to put the pixels being read, but OpenEXR's frameBuffer.insert()
// wants where the address of the "virtual framebuffer" for the
// whole image.
char *buf = (char *)data
- x * pixel_bytes
- y * pixel_bytes * m_spec.tile_width;
try {
Imf::FrameBuffer frameBuffer;
size_t chanoffset = 0;
for (int c = 0; c < m_spec.nchannels; ++c) {
size_t chanbytes = m_spec.channelformats.size()
? m_spec.channelformats[c].size()
: m_spec.format.size();
frameBuffer.insert (m_spec.channelnames[c].c_str(),
Imf::Slice (m_pixeltype[c],
buf + chanoffset, pixel_bytes,
pixel_bytes*m_spec.tile_width));
chanoffset += chanbytes;
}
m_output_tiled->setFrameBuffer (frameBuffer);
m_output_tiled->writeTile ((x - m_spec.x) / m_spec.tile_width,
(y - m_spec.y) / m_spec.tile_height,
m_miplevel, m_miplevel);
}
catch (const std::exception &e) {
error ("Failed OpenEXR write: %s", e.what());
return false;
}
return true;
}
示例12: spec
bool
OpenEXROutput::write_scanline (int y, int z, TypeDesc format,
const void *data, stride_t xstride)
{
bool native = (format == TypeDesc::UNKNOWN);
size_t pixel_bytes = m_spec.pixel_bytes (true); // native
if (native && xstride == AutoStride)
xstride = (stride_t) pixel_bytes;
m_spec.auto_stride (xstride, format, spec().nchannels);
data = to_native_scanline (format, data, xstride, m_scratch);
// Compute where OpenEXR needs to think the full buffers starts.
// OpenImageIO requires that 'data' points to where the client wants
// to put the pixels being read, but OpenEXR's frameBuffer.insert()
// wants where the address of the "virtual framebuffer" for the
// whole image.
imagesize_t scanlinebytes = m_spec.scanline_bytes (native);
char *buf = (char *)data
- m_spec.x * pixel_bytes
- y * scanlinebytes;
try {
Imf::FrameBuffer frameBuffer;
size_t chanoffset = 0;
for (int c = 0; c < m_spec.nchannels; ++c) {
size_t chanbytes = m_spec.channelformats.size()
? m_spec.channelformats[c].size()
: m_spec.format.size();
frameBuffer.insert (m_spec.channelnames[c].c_str(),
Imf::Slice (m_pixeltype[c],
buf + chanoffset,
pixel_bytes, scanlinebytes));
chanoffset += chanbytes;
}
m_output_scanline->setFrameBuffer (frameBuffer);
m_output_scanline->writePixels (1);
}
catch (const std::exception &e) {
error ("Failed OpenEXR write: %s", e.what());
return false;
}
// FIXME -- can we checkpoint the file?
return true;
}
示例13: WriteFrameBufferChannel
void FExrImageWrapper::WriteFrameBufferChannel(Imf::FrameBuffer& ImfFrameBuffer, const char* ChannelName, const sourcetype* SrcData, TArray<uint8>& ChannelBuffer)
{
const int32 OutputPixelSize = ((OutputFormat == Imf::HALF) ? 2 : 4);
ChannelBuffer.AddUninitialized(Width*Height*OutputPixelSize);
uint32 SrcChannels = GetNumChannelsFromFormat(RawFormat);
ExtractAndConvertChannel(SrcData, SrcChannels, Width, Height, (typename TExrImageOutputChannelType<OutputFormat>::Type*)&ChannelBuffer[0]);
Imf::Slice FrameChannel = Imf::Slice(OutputFormat, (char*)&ChannelBuffer[0], OutputPixelSize, Width*OutputPixelSize);
ImfFrameBuffer.insert(ChannelName, FrameChannel);
}
示例14: catch
bool
OpenEXRInput::read_native_scanlines (int ybegin, int yend, int z,
int firstchan, int nchans, void *data)
{
// std::cerr << "openexr rns " << ybegin << ' ' << yend << ", channels "
// << firstchan << "-" << (firstchan+nchans-1) << "\n";
if (m_input_scanline == NULL)
return false;
// Compute where OpenEXR needs to think the full buffers starts.
// OpenImageIO requires that 'data' points to where the client wants
// to put the pixels being read, but OpenEXR's frameBuffer.insert()
// wants where the address of the "virtual framebuffer" for the
// whole image.
size_t pixelbytes = m_spec.pixel_bytes (firstchan, nchans, true);
size_t scanlinebytes = (size_t)m_spec.width * pixelbytes;
char *buf = (char *)data
- m_spec.x * pixelbytes
- ybegin * scanlinebytes;
try {
Imf::FrameBuffer frameBuffer;
size_t chanoffset = 0;
for (int c = 0; c < nchans; ++c) {
size_t chanbytes = m_spec.channelformats.size()
? m_spec.channelformats[c+firstchan].size()
: m_spec.format.size();
frameBuffer.insert (m_spec.channelnames[c+firstchan].c_str(),
Imf::Slice (m_pixeltype[c+firstchan],
buf + chanoffset,
pixelbytes, scanlinebytes));
chanoffset += chanbytes;
}
m_input_scanline->setFrameBuffer (frameBuffer);
m_input_scanline->readPixels (ybegin, yend-1);
}
catch (const std::exception &e) {
error ("Failed OpenEXR read: %s", e.what());
return false;
}
return true;
}
示例15: ASSERT
bool
OpenEXRInput::read_native_tile (int x, int y, int z, void *data)
{
ASSERT (m_input_tiled != NULL);
// Compute where OpenEXR needs to think the full buffers starts.
// OpenImageIO requires that 'data' points to where the client wants
// to put the pixels being read, but OpenEXR's frameBuffer.insert()
// wants where the address of the "virtual framebuffer" for the
// whole image.
size_t pixelbytes = m_spec.pixel_bytes (true);
char *buf = (char *)data
- x * pixelbytes
- y * pixelbytes * m_spec.tile_width;
try {
Imf::FrameBuffer frameBuffer;
size_t chanoffset = 0;
for (int c = 0; c < m_spec.nchannels; ++c) {
size_t chanbytes = m_spec.channelformats.size()
? m_spec.channelformats[c].size()
: m_spec.format.size();
frameBuffer.insert (m_spec.channelnames[c].c_str(),
Imf::Slice (m_pixeltype[c],
buf + chanoffset, pixelbytes,
pixelbytes*m_spec.tile_width));
chanoffset += chanbytes;
}
m_input_tiled->setFrameBuffer (frameBuffer);
m_input_tiled->readTile ((x - m_spec.x) / m_spec.tile_width,
(y - m_spec.y) / m_spec.tile_height,
m_miplevel, m_miplevel);
}
catch (const std::exception &e) {
error ("Filed OpenEXR read: %s", e.what());
return false;
}
return true;
}