本文整理汇总了C++中imf::FrameBuffer类的典型用法代码示例。如果您正苦于以下问题:C++ FrameBuffer类的具体用法?C++ FrameBuffer怎么用?C++ FrameBuffer使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了FrameBuffer类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的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);
}
开发者ID:yaoyansi,项目名称:maya2renderer,代码行数:31,代码来源:exrinputfile.cpp
示例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());
}
开发者ID:valdersoul,项目名称:NoriV2,代码行数:26,代码来源:bitmap.cpp
示例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());
}
开发者ID:apextw,项目名称:Ramen,代码行数:30,代码来源:write_exr.cpp
示例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;
}
开发者ID:Epsirom,项目名称:Stylization,代码行数:25,代码来源:imageIO.cpp
示例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;
}
开发者ID:KelSolaar,项目名称:oiio,代码行数:56,代码来源:exrinput.cpp
示例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();
}
开发者ID:valdersoul,项目名称:NoriV2,代码行数:52,代码来源:bitmap.cpp
示例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
}
开发者ID:amarburg,项目名称:Pangolin,代码行数:52,代码来源:image_io.cpp
示例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;
}
开发者ID:ArturSoczek,项目名称:OpenGLInsightsCode,代码行数:51,代码来源:image.cpp
示例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
}
开发者ID:Anantak,项目名称:Pangolin,代码行数:49,代码来源:image_io.cpp
示例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);
}
开发者ID:MassW,项目名称:OpenMaya,代码行数:48,代码来源:FujiImgTools.cpp
示例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;
}
开发者ID:cmstein,项目名称:oiio,代码行数:47,代码来源:exroutput.cpp
示例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;
}
开发者ID:schworer,项目名称:oiio,代码行数:46,代码来源:exroutput.cpp
示例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);
}
开发者ID:zhaoyizheng0930,项目名称:UnrealEngine,代码行数:9,代码来源:ExrImageWrapper.cpp
示例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;
}
开发者ID:deepakg92,项目名称:oiio,代码行数:42,代码来源:exrinput.cpp
示例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;
}
开发者ID:angeljimenez,项目名称:oiio,代码行数:40,代码来源:exrinput.cpp
示例16:
void OpenEXRImpl :: load_channels(Imf::InputFile &file, Matrix& mat, int numChannels, const char *channelNames) {
Imath::Box2i dw = file.header().dataWindow();
int width = dw.max.x - dw.min.x + 1;
int height = dw.max.y - dw.min.y + 1;
mat.create(numChannels, Matrix::FLOAT32, width, height);
Imf::FrameBuffer frameBuffer;
for(int i=0; i < numChannels; i++) {
char c[2];
c[0] = channelNames[i];
c[1] = '\0';
frameBuffer.insert(c,
Imf::Slice(Imf::FLOAT,
(char *)(mat.data.fl + i),
sizeof(float)*numChannels,
sizeof(float)*numChannels*width));
}
file.setFrameBuffer(frameBuffer);
file.readPixels(dw.min.y, dw.max.y);
}
开发者ID:LuaAV,项目名称:LuaAV,代码行数:22,代码来源:OpenEXRImpl.cpp
示例17: saveExr
bool saveExr(const Path &path, const float *img, int w, int h, int channels)
{
if (channels <= 0 || channels > 4)
return false;
OutputStreamHandle outputStream = FileUtils::openOutputStream(path);
if (!outputStream)
return false;
try {
Imf::Header header(w, h, 1.0f, Imath::V2f(0, 0), 1.0f, Imf::INCREASING_Y, Imf::PIZ_COMPRESSION);
Imf::FrameBuffer frameBuffer;
std::unique_ptr<half[]> data(new half[w*h*channels]);
for (int i = 0; i < w*h*channels; ++i)
data[i] = half(img[i]);
const char *channelNames[] = {"R", "G", "B", "A"};
for (int i = 0; i < channels; ++i) {
const char *channelName = (channels == 1) ? "Y" : channelNames[i];
header.channels().insert(channelName, Imf::Channel(Imf::HALF));
frameBuffer.insert(channelName, Imf::Slice(Imf::HALF, reinterpret_cast<char *>(data.get() + i),
sizeof(half)*channels, sizeof(half)*channels*w));
}
ExrOStream out(std::move(outputStream));
Imf::OutputFile file(out, header);
file.setFrameBuffer(frameBuffer);
file.writePixels(h);
return true;
} catch(const std::exception &e) {
std::cout << "OpenEXR writer failed: " << e.what() << std::endl;
return false;
}
}
开发者ID:caomw,项目名称:tungsten,代码行数:38,代码来源:ImageIO.cpp
示例18: write_half_rgb_exr
void write_half_rgb_exr( Imf::OStream& os, Imf::Header& header, const image::const_image_view_t& view)
{
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);
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);
Imf::OutputFile out_file( os, header);
out_file.setFrameBuffer( frameBuffer);
out_file.writePixels( img.height());
}
开发者ID:apextw,项目名称:Ramen,代码行数:23,代码来源:write_exr.cpp
示例19: read_frame
int FileEXR::read_frame(VFrame *frame, VFrame *data)
{
EXRIStream exr_stream((char*)data->get_data(), data->get_compressed_size());
Imf::InputFile file(exr_stream);
Imath::Box2i dw = file.header().dataWindow();
int dx = dw.min.x;
int dy = dw.min.y;
Imf::FrameBuffer framebuffer;
float **rows = (float**)frame->get_rows();
int components = BC_CModels::components(frame->get_color_model());
if(is_yuv)
{
if(!temp_y) temp_y = new float[asset->width * asset->height];
if(!temp_u) temp_u = new float[asset->width * asset->height / 4];
if(!temp_v) temp_v = new float[asset->width * asset->height / 4];
framebuffer.insert("Y", Imf::Slice(Imf::FLOAT,
(char*)(temp_y - dy * asset->width - dx),
sizeof(float),
sizeof(float) * frame->get_w()));
framebuffer.insert("BY", Imf::Slice(Imf::FLOAT,
(char*)(temp_u - dy * asset->width / 4 - dx / 2),
sizeof(float),
sizeof(float) * frame->get_w() / 2,
2,
2));
framebuffer.insert("RY", Imf::Slice(Imf::FLOAT,
(char*)(temp_v - dy * asset->width / 4 - dx / 2),
sizeof(float),
sizeof(float) * frame->get_w() / 2,
2,
2));
}
else
{
framebuffer.insert("R", Imf::Slice(Imf::FLOAT,
(char*)(&rows[-dy][-dx * components]),
sizeof(float) * components,
sizeof(float) * components * frame->get_w()));
framebuffer.insert("G", Imf::Slice(Imf::FLOAT,
(char*)(&rows[-dy][-dx * components + 1]),
sizeof(float) * components,
sizeof(float) * components * frame->get_w()));
framebuffer.insert("B", Imf::Slice(Imf::FLOAT,
(char*)(&rows[-dy][-dx * components + 2]),
sizeof(float) * components,
sizeof(float) * components * frame->get_w()));
}
// Alpha always goes directly to the output frame
if(components == 4)
{
framebuffer.insert("A", Imf::Slice(Imf::FLOAT,
(char*)(&rows[-dy][-dx * components + 3]),
sizeof(float) * components,
sizeof(float) * components * frame->get_w()));
}
file.setFrameBuffer(framebuffer);
file.readPixels (dw.min.y, dw.max.y);
if(is_yuv)
{
// Convert to RGB using crazy ILM equations
Imath::V3f yw;
Imf::Chromaticities cr;
yw = Imf::RgbaYca::computeYw(cr);
for(int i = 0; i < asset->height - 1; i += 2)
{
float *y_row1 = temp_y + i * asset->width;
float *y_row2 = temp_y + (i + 1) * asset->width;
float *u_row = temp_u + (i * asset->width / 4);
float *v_row = temp_v + (i * asset->width / 4);
float *out_row1 = rows[i];
float *out_row2 = rows[i + 1];
for(int j = 0; j < asset->width - 1; j += 2)
{
float v = *u_row++;
float u = *v_row++;
float y;
float r, g, b;
y = *y_row1++;
r = (u + 1) * y;
b = (v + 1) * y;
g = (y - r * yw.x - b * yw.z) / yw.y;
*out_row1++ = r;
*out_row1++ = g;
*out_row1++ = b;
if(components == 4) out_row1++;
y = *y_row1++;
r = (u + 1) * y;
b = (v + 1) * y;
g = (y - r * yw.x - b * yw.z) / yw.y;
*out_row1++ = r;
*out_row1++ = g;
//.........这里部分代码省略.........
开发者ID:ratopi,项目名称:CinelerraCV,代码行数:101,代码来源:fileexr.C
示例20: ostream
//.........这里部分代码省略.........
} else {
// default value
pixelType = Imf::HALF; // save as half data type
}
// check the data type and number of channels
int components = 0;
FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
switch(image_type) {
case FIT_FLOAT:
components = 1;
// insert luminance channel
header.channels().insert ("Y", Imf::Channel(pixelType));
break;
case FIT_RGBF:
components = 3;
for(int c = 0; c < components; c++) {
// insert R, G and B channels
header.channels().insert (channel_name[c], Imf::Channel(pixelType));
}
break;
case FIT_RGBAF:
components = 4;
for(int c = 0; c < components; c++) {
// insert R, G, B and A channels
header.channels().insert (channel_name[c], Imf::Channel(pixelType));
}
break;
default:
THROW (Iex::ArgExc, "Cannot save: invalid data type.\nConvert the image to float before saving as OpenEXR.");
}
// build a frame buffer (i.e. what we have on input)
Imf::FrameBuffer frameBuffer;
BYTE *bits = NULL; // pointer to our pixel buffer
size_t bytespp = 0; // size of our pixel in bytes
size_t bytespc = 0; // size of our pixel component in bytes
unsigned pitch = 0; // size of our yStride in bytes
if(pixelType == Imf::HALF) {
// convert from float to half
halfData = new(std::nothrow) half[width * height * components];
if(!halfData) THROW (Iex::NullExc, FI_MSG_ERROR_MEMORY);
for(int y = 0; y < height; y++) {
float *src_bits = (float*)FreeImage_GetScanLine(dib, height - 1 - y);
half *dst_bits = halfData + y * width * components;
for(int x = 0; x < width; x++) {
for(int c = 0; c < components; c++) {
dst_bits[c] = src_bits[c];
}
src_bits += components;
dst_bits += components;
}
}
bits = (BYTE*)halfData;
bytespc = sizeof(half);
bytespp = sizeof(half) * components;
pitch = sizeof(half) * width * components;
} else if(pixelType == Imf::FLOAT) {
// invert dib scanlines
bIsFlipped = FreeImage_FlipVertical(dib);
bits = FreeImage_GetBits(dib);
开发者ID:respu,项目名称:xsilium-engine,代码行数:67,代码来源:PluginEXR.cpp
注:本文中的imf::FrameBuffer类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论