本文整理汇总了C++中ImageBuf::spec方法的典型用法代码示例。如果您正苦于以下问题:C++ ImageBuf::spec方法的具体用法?C++ ImageBuf::spec怎么用?C++ ImageBuf::spec使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ImageBuf
的用法示例。
在下文中一共展示了ImageBuf::spec方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: dst_roi
bool
ImageBufAlgo::rotate180 (ImageBuf &dst, const ImageBuf &src,
ROI roi, int nthreads)
{
if (&dst == &src) { // Handle in-place operation
ImageBuf tmp;
tmp.swap (const_cast<ImageBuf&>(src));
return rotate180 (dst, tmp, roi, nthreads);
}
ROI src_roi = roi.defined() ? roi : src.roi();
ROI src_roi_full = src.roi_full();
int xoffset = src_roi.xbegin - src_roi_full.xbegin;
int xstart = src_roi_full.xend - xoffset - src_roi.width();
int yoffset = src_roi.ybegin - src_roi_full.ybegin;
int ystart = src_roi_full.yend - yoffset - src_roi.height();
ROI dst_roi (xstart, xstart+src_roi.width(),
ystart, ystart+src_roi.height(),
src_roi.zbegin, src_roi.zend,
src_roi.chbegin, src_roi.chend);
ASSERT (dst_roi.width() == src_roi.width() &&
dst_roi.height() == src_roi.height());
// Compute the destination ROI, it's the source ROI reflected across
// the midline of the display window.
IBAprep (dst_roi, &dst, &src);
bool ok;
OIIO_DISPATCH_TYPES2 (ok, "rotate180", rotate180_,
dst.spec().format, src.spec().format,
dst, src, dst_roi, nthreads);
return ok;
}
示例2: if
bool
ImageBufAlgo::render_line (ImageBuf &dst, int x1, int y1, int x2, int y2,
array_view<const float> color,
bool skip_first_point,
ROI roi, int nthreads)
{
if (! IBAprep (roi, &dst))
return false;
if (int(color.size()) < roi.chend) {
dst.error ("Not enough channels for the color (needed %d)", roi.chend);
return false; // Not enough color channels specified
}
const ImageSpec &spec (dst.spec());
// Alpha: if the image's spec designates an alpha channel, use it if
// it's within the range specified by color. Otherwise, if color
// includes more values than the highest channel roi says we should
// modify, assume the first extra value is alpha. If all else fails,
// make the line opaque (alpha=1.0).
float alpha = 1.0f;
if (spec.alpha_channel >= 0 && spec.alpha_channel < int(color.size()))
alpha = color[spec.alpha_channel];
else if (int(color.size()) == roi.chend+1)
alpha = color[roi.chend];
bool ok;
OIIO_DISPATCH_TYPES (ok, "render_line", render_line_, dst.spec().format,
dst, x1, y1, x2, y2, color, alpha, skip_first_point,
roi, nthreads);
return ok;
}
示例3: switch
/// Fix all non-finite pixels (nan/inf) using the specified approach
bool
ImageBufAlgo::fixNonFinite (ImageBuf &src,
NonFiniteFixMode mode, int *pixelsFixed,
ROI roi, int nthreads)
{
// If no ROI is defined, use the data window of src.
if (! roi.defined())
roi = get_roi(src.spec());
roi.chend = std::min (roi.chend, src.nchannels());
// Initialize
if (pixelsFixed)
*pixelsFixed = 0;
switch (src.spec().format.basetype) {
case TypeDesc::FLOAT :
return fixNonFinite_<float> (src, mode, pixelsFixed, roi, nthreads);
case TypeDesc::HALF :
return fixNonFinite_<half> (src, mode, pixelsFixed, roi, nthreads);
case TypeDesc::DOUBLE:
return fixNonFinite_<double> (src, mode, pixelsFixed, roi, nthreads);
default:
// All other format types aren't capable of having nonfinite
// pixel values.
return true;
}
}
示例4: logtime
bool
ImageBufAlgo::sub(ImageBuf& dst, Image_or_Const A_, Image_or_Const B_, ROI roi,
int nthreads)
{
pvt::LoggedTimer logtime("IBA::sub");
if (A_.is_img() && B_.is_img()) {
const ImageBuf &A(A_.img()), &B(B_.img());
if (!IBAprep(roi, &dst, &A, &B))
return false;
ROI origroi = roi;
roi.chend = std::min(roi.chend, std::min(A.nchannels(), B.nchannels()));
bool ok;
OIIO_DISPATCH_COMMON_TYPES3(ok, "sub", sub_impl, dst.spec().format,
A.spec().format, B.spec().format, dst, A, B,
roi, nthreads);
if (roi.chend < origroi.chend && A.nchannels() != B.nchannels()) {
// Edge case: A and B differed in nchannels, we allocated dst to be
// the bigger of them, but adjusted roi to be the lesser. Now handle
// the channels that got left out because they were not common to
// all the inputs.
ASSERT(roi.chend <= dst.nchannels());
roi.chbegin = roi.chend;
roi.chend = origroi.chend;
if (A.nchannels() > B.nchannels()) { // A exists
copy(dst, A, dst.spec().format, roi, nthreads);
} else { // B exists
copy(dst, B, dst.spec().format, roi, nthreads);
}
}
return ok;
}
if (A_.is_val() && B_.is_img()) // canonicalize to A_img, B_val
A_.swap(B_);
if (A_.is_img() && B_.is_val()) {
const ImageBuf& A(A_.img());
cspan<float> b = B_.val();
if (!IBAprep(roi, &dst, &A,
IBAprep_CLAMP_MUTUAL_NCHANNELS | IBAprep_SUPPORT_DEEP))
return false;
IBA_FIX_PERCHAN_LEN_DEF(b, A.nchannels());
// Negate b (into a copy)
int nc = A.nchannels();
float* vals = ALLOCA(float, nc);
for (int c = 0; c < nc; ++c)
vals[c] = -b[c];
b = cspan<float>(vals, nc);
if (dst.deep()) {
// While still serial, set up all the sample counts
dst.deepdata()->set_all_samples(A.deepdata()->all_samples());
return add_impl_deep(dst, A, b, roi, nthreads);
}
bool ok;
OIIO_DISPATCH_COMMON_TYPES2(ok, "sub", add_impl, dst.spec().format,
A.spec().format, dst, A, b, roi, nthreads);
return ok;
}
// Remaining cases: error
dst.error("ImageBufAlgo::sub(): at least one argument must be an image");
return false;
}
示例5: return
static bool
same_size (const ImageBuf &A, const ImageBuf &B)
{
const ImageSpec &a (A.spec()), &b (B.spec());
return (a.width == b.width && a.height == b.height &&
a.depth == b.depth && a.nchannels == b.nchannels);
}
示例6: ALLOCA
bool
ImageBufAlgo::channels (ImageBuf &dst, const ImageBuf &src,
int nchannels, const int *channelorder,
const float *channelvalues,
const std::string *newchannelnames,
bool shuffle_channel_names)
{
// Not intended to create 0-channel images.
if (nchannels <= 0) {
dst.error ("%d-channel images not supported", nchannels);
return false;
}
// If we dont have a single source channel,
// hard to know how big to make the additional channels
if (src.spec().nchannels == 0) {
dst.error ("%d-channel images not supported", src.spec().nchannels);
return false;
}
// If channelorder is NULL, it will be interpreted as
// {0, 1, ..., nchannels-1}.
int *local_channelorder = NULL;
if (! channelorder) {
local_channelorder = ALLOCA (int, nchannels);
for (int c = 0; c < nchannels; ++c)
local_channelorder[c] = c;
channelorder = local_channelorder;
}
示例7:
bool
ImageBufAlgo::compare (const ImageBuf &A, const ImageBuf &B,
float failthresh, float warnthresh,
ImageBufAlgo::CompareResults &result,
ROI roi, int nthreads)
{
// If no ROI is defined, use the union of the data windows of the two
// images.
if (! roi.defined())
roi = roi_union (get_roi(A.spec()), get_roi(B.spec()));
roi.chend = std::min (roi.chend, std::max(A.nchannels(), B.nchannels()));
// Deep and non-deep images cannot be compared
if (B.deep() != A.deep())
return false;
bool ok;
OIIO_DISPATCH_TYPES2 (ok, "compare", compare_,
A.spec().format, B.spec().format,
A, B, failthresh, warnthresh, result,
roi, nthreads);
// FIXME - The nthreads argument is for symmetry with the rest of
// ImageBufAlgo and for future expansion. But for right now, we
// don't actually split by threads. Maybe later.
return ok;
}
示例8: flip
bool
ImageBufAlgo::flip(ImageBuf &dst, const ImageBuf &src, ROI roi, int nthreads)
{
if (&dst == &src) { // Handle in-place operation
ImageBuf tmp;
tmp.swap (const_cast<ImageBuf&>(src));
return flip (dst, tmp, roi, nthreads);
}
pvt::LoggedTimer logtime("IBA::flip");
ROI src_roi = roi.defined() ? roi : src.roi();
ROI src_roi_full = src.roi_full();
int offset = src_roi.ybegin - src_roi_full.ybegin;
int start = src_roi_full.yend - offset - src_roi.height();
ROI dst_roi (src_roi.xbegin, src_roi.xend,
start, start+src_roi.height(),
src_roi.zbegin, src_roi.zend,
src_roi.chbegin, src_roi.chend);
ASSERT (dst_roi.width() == src_roi.width() &&
dst_roi.height() == src_roi.height());
// Compute the destination ROI, it's the source ROI reflected across
// the midline of the display window.
if (! IBAprep (dst_roi, &dst, &src))
return false;
bool ok;
OIIO_DISPATCH_COMMON_TYPES2 (ok, "flip", flip_,
dst.spec().format, src.spec().format,
dst, src, dst_roi, nthreads);
return ok;
}
示例9: ASSERT
bool
ImageBufAlgo::absdiff (ImageBuf &dst, const ImageBuf &A, const ImageBuf &B,
ROI roi, int nthreads)
{
if (! IBAprep (roi, &dst, &A, &B))
return false;
ROI origroi = roi;
roi.chend = std::min (roi.chend, std::min (A.nchannels(), B.nchannels()));
bool ok;
OIIO_DISPATCH_COMMON_TYPES3 (ok, "absdiff", absdiff_impl, dst.spec().format,
A.spec().format, B.spec().format,
dst, A, B, roi, nthreads);
if (roi.chend < origroi.chend && A.nchannels() != B.nchannels()) {
// Edge case: A and B differed in nchannels, we allocated dst to be
// the bigger of them, but adjusted roi to be the lesser. Now handle
// the channels that got left out because they were not common to
// all the inputs.
ASSERT (roi.chend <= dst.nchannels());
roi.chbegin = roi.chend;
roi.chend = origroi.chend;
if (A.nchannels() > B.nchannels()) { // A exists
abs (dst, A, roi, nthreads);
} else { // B exists
abs (dst, B, roi, nthreads);
}
}
return ok;
}
示例10: IBAprep
bool
ImageBufAlgo::flop (ImageBuf &dst, const ImageBuf &src, ROI roi, int nthreads)
{
IBAprep (roi, &dst);
OIIO_DISPATCH_TYPES2 ("flop", flop_,
dst.spec().format, src.spec().format, dst, src,
roi, nthreads);
return false;
}
示例11:
bool
ImageBufAlgo::mul (ImageBuf &dst, const ImageBuf &A, const float *b,
ROI roi, int nthreads)
{
if (! IBAprep (roi, &dst, &A))
return false;
OIIO_DISPATCH_TYPES2 ("mul", mul_impl, dst.spec().format,
A.spec().format, dst, A, b, roi, nthreads);
return true;
}
示例12: IBAprep
bool
ImageBufAlgo::sub (ImageBuf &dst, const ImageBuf &A, const ImageBuf &B,
ROI roi, int nthreads)
{
IBAprep (roi, &dst, &A, &B);
OIIO_DISPATCH_COMMON_TYPES3 ("sub", sub_impl, dst.spec().format,
A.spec().format, B.spec().format,
dst, A, B, roi, nthreads);
return true;
}
示例13:
static inline void
transfer_pixels_ (ImageBuf &buf, ColorTransfer *tfunc)
{
for (ImageBuf::Iterator<T> pixel (buf); pixel.valid(); ++pixel) {
convert_types (buf.spec().format, pixel.rawptr(),
buf.spec().format, pixel.rawptr(),
buf.nchannels(), tfunc,
buf.spec().alpha_channel, buf.spec().z_channel);
}
}
示例14: float
bool
ImageBufAlgo::resize (ImageBuf &dst, const ImageBuf &src,
const std::string &filtername_, float fwidth,
ROI roi, int nthreads)
{
if (! IBAprep (roi, &dst, &src))
return false;
const ImageSpec &srcspec (src.spec());
const ImageSpec &dstspec (dst.spec());
if (dstspec.nchannels != srcspec.nchannels) {
dst.error ("channel number mismatch: %d vs. %d",
dst.spec().nchannels, src.spec().nchannels);
return false;
}
if (dstspec.depth > 1 || srcspec.depth > 1) {
dst.error ("ImageBufAlgo::resize does not support volume images");
return false;
}
// Resize ratios
float wratio = float(dstspec.full_width) / float(srcspec.full_width);
float hratio = float(dstspec.full_height) / float(srcspec.full_height);
// Set up a shared pointer with custom deleter to make sure any
// filter we allocate here is properly destroyed.
boost::shared_ptr<Filter2D> filter ((Filter2D*)NULL, Filter2D::destroy);
std::string filtername = filtername_;
if (filtername.empty()) {
// No filter name supplied -- pick a good default
if (wratio > 1.0f || hratio > 1.0f)
filtername = "blackman-harris";
else
filtername = "lanczos3";
}
for (int i = 0, e = Filter2D::num_filters(); i < e; ++i) {
FilterDesc fd;
Filter2D::get_filterdesc (i, &fd);
if (fd.name == filtername) {
float w = fwidth > 0.0f ? fwidth : fd.width * std::max (1.0f, wratio);
float h = fwidth > 0.0f ? fwidth : fd.width * std::max (1.0f, hratio);
filter.reset (Filter2D::create (filtername, w, h));
break;
}
}
if (! filter) {
dst.error ("Filter \"%s\" not recognized", filtername);
return false;
}
OIIO_DISPATCH_TYPES2 ("resize", resize_,
dstspec.format, srcspec.format,
dst, src, filter.get(), roi, nthreads);
return false;
}
示例15:
bool
ImageBufAlgo::mul (ImageBuf &dst, const ImageBuf &A, const float *b,
ROI roi, int nthreads)
{
if (! IBAprep (roi, &dst, &A, IBAprep_CLAMP_MUTUAL_NCHANNELS))
return false;
bool ok;
OIIO_DISPATCH_COMMON_TYPES2 (ok, "mul", mul_impl, dst.spec().format,
A.spec().format, dst, A, b, roi, nthreads);
return ok;
}