Image

Constructors

this
this(Image img)

from other image

this
this(Image img)

from other image

this
this(Vector!(N, T) size, ElemInfo info, void[] data)

from size, element info and data

this
this(Vector!(N, T) size, size_t ch, DataType type, void[] data)

from size, channel count, component type and data

Postblit

this(this)
this(this)

copy ctor

Members

Functions

clear
void clear()

fill data zeros

dump
immutable(void[]) dump()
index
size_t index(T[] crd)

return line index by coordinate

pixel
T pixel(C[] crd)
const(T) pixel(C[] crd)
T pixel(Vector!(N, C) crd)
const(T) pixel(Vector!(N, C) crd)

access to pixel

robSize
CrdVector!0 robSize(size_t K)
Undocumented in source. Be warned that the author may not have intended to support it.

Properties

dataSize
size_t dataSize [@property getter]

image data size

dims
size_t dims [@property getter]
Undocumented in source. Be warned that the author may not have intended to support it.
dup
auto dup [@property getter]

get copy of image

idup
auto idup [@property getter]

get immutable copy of image

mapAs
T[] mapAs [@property getter]
const(T)[] mapAs [@property getter]

cast data to T[]

pixelCount
size_t pixelCount [@property getter]

Static functions

external
auto external(Vector!(N, T) size, ElemInfo info, void[] data)
auto external(Vector!(N, T) size, size_t ch, DataType type, void[] data)

use external memory (not copy)

load
auto load(immutable(void[]) rawdata)

Variables

data
void[] data;
info
ElemInfo info;
size
CrdVector!0 size;

Examples

import std.stdio;
auto a = Image( ivec2(3,3), 3, DataType.UBYTE );
assert( a.data.length != 0 );
assert( eq( a.size, [3,3] ) );
a.pixel!bvec3(0,0) = bvec3(1,2,3);
auto b = a;
assert( b == a );
assert( eq( b.pixel!bvec3(0,0), bvec3(1,2,3) ) );
a.pixel!bvec3(1,1) = bvec3(3,4,5);
assert( b != a );
assert( b == Image.load( b.dump() ) );
assert( b == b.dup );
assert( b.data == b.idup.data.dup );
a = b;
assert( b == a );
assert( a == Image.load( b.dump() ) );
assert( a == b.dup );
assert( a.data == b.idup.data.dup );
auto crd = ivec2(1,2);
b.pixel!bvec3(crd) = bvec3(5,6,8);
assert( eq( b.pixel!bvec3(1,2), bvec3(5,6,8) ) );

b.clear();
assert( eq( b.pixel!bvec3(1,2), bvec3(0,0,0) ) );
auto a = Image( ivec2(3,3), ElemInfo( 1, DataType.UBYTE ), to!(ubyte[])([ 1,2,3,4,5,6,7,8,9 ]) );
auto b = Image(a);

assert( a.pixel!ubyte(0,0) == 1 );
assert( b.pixel!ubyte(0,0) == 1 );
a.pixel!ubyte(0,0) = 2;
assert( a.pixel!ubyte(0,0) == 2 );
assert( b.pixel!ubyte(0,0) == 1 );

auto c = immutable Image(a);
assert( c.pixel!ubyte(0,0) == 2 );
auto a = Image( ivec!1(3), 1, DataType.UBYTE, to!(ubyte[])([ 1,2,3 ]) );
assert(  mustExcept!Throwable({ a.pixel!(ubyte)(7) = 0; }) );
assert( !mustExcept({ a.pixel!(ubyte)(0) = 0; }) );

assert( a.pixel!ubyte(0) == 0 );

auto b = Image(a);
b.size.length = 2;
b.size[1] = 1;

assert( b.size[0] == 3 );
assert( b.size[1] == 1 );

assert( b.pixel!ubyte(0,0) == 0 );
assert( b.pixel!ubyte(1,0) == 2 );
assert( mustExcept!Throwable({ b.pixel!ubyte(1,1) = 2; }) );

auto c = Image(a);
c.size.length = 2;
c.size = ivec2(1,3);

assert( c.size[0] == 1 );
assert( c.size[1] == 3 );

assert( c.pixel!ubyte(0,0) == 0 );
assert( c.pixel!ubyte(0,1) == 2 );
assert( mustExcept!Throwable({ c.pixel!ubyte(1,1) = 2; }) );

c.size = ivec2(2,2);

assert( c.size[0] == 2 );
assert( c.size[1] == 2 );
auto a = Image( ivec2(3,3), 2, DataType.FLOAT );

assert( a.index([1,2]) == 7 );
assert( a.index(ivec2(1,2)) == 7 );

a.mapAs!(vec2)[a.index([1,2])] = vec2(1,1);
assert( a.pixel!vec2(1,2) == vec2(1,1) );

a.pixel!vec2(1,2) = vec2(2,2);
assert( a.pixel!vec2(1,2) == vec2(2,2) );

use external memory

float[] data = [ 1.0, 2, 3, 4 ];
auto img = Image.external( ivec2(2,2), 1, DataType.FLOAT, data );

img.pixel!float(0,0) = 8.0f;

assert( data[0] == 8.0f );
Image img;
assert( img.size.length == 0 );
assert( img.data.length == 0 );

img.size = ivec2(3,3);
img.info = ElemInfo( 3, DataType.NORM_FIXED );
img.clear();

assert( img.data.length == 27 * float.sizeof );
assert( img.info.bpe == 3 * float.sizeof );

img.pixel!vec3(0,1) = vec3( .2,.1,.3 );
assert( img.pixel!vec3(0,1) == vec3(.2,.1,.3) );

auto di = Image.load( img.dump() );
assert( di.size == img.size );
assert( di.info == img.info );
assert( di.data == img.data );

auto ii = immutable(Image)( img );
assert( ii.size == img.size );
assert( ii.info == img.info );
assert( ii.data == img.data );

assert( ii.pixel!vec3(0,1) == vec3(.2,.1,.3) );

auto dii = immutable(Image).load( ii.dump() );
static assert( is( typeof(dii) == Image ) );
assert( dii.size == img.size );
assert( dii.info == img.info );
assert( dii.data == img.data );

auto dd = ii.dup;
static assert( is( typeof(dd) == Image ) );
assert( dd.size == img.size );
assert( dd.info == img.info );
assert( dd.data == img.data );

auto ddi = ii.idup;
static assert( is( typeof(ddi) == immutable(Image) ) );
assert( ddi.size == img.size );
assert( ddi.info == img.info );
assert( ddi.data == img.data );
auto data =
[
    vec2( 1, 2 ), vec2( 3, 4 ), vec2( 5, 6 ),
    vec2( 7, 8 ), vec2( 9, 1 ), vec2( 1, 2 ),
    vec2( 2, 3 ), vec2( 4, 5 ), vec2( 6, 7 )
];

auto img = Image( ivec2(3,3), 2, DataType.FLOAT, data );

assert( img.size == ivec2(3,3) );
assert( img.info.bpe == 2 * float.sizeof );

assert( img.pixel!vec2(1,1) == vec2(9,1) );
assert( img.info.type == DataType.FLOAT );

auto imdata = img.mapAs!vec2;
assert( data == imdata );

img.clear();
assert( img.pixel!vec2(1,1) == vec2(0,0) );

img.mapAs!(vec2)[] = data[];
imdata = img.mapAs!vec2;
assert( data == imdata );

auto constdata = img.idup.mapAs!vec2;
assertEq( constdata, imdata );
assert( is( typeof(constdata) == const(vec2)[] ) );
assert( mustExcept({ Image( ivec2(3,3), ElemInfo(3,DataType.UBYTE), [ 1, 2, 3 ] ); }) );

auto dt = [ vec2(1,0), vec2(0,1) ];
assert( mustExcept({ Image( ivec2(3,3), 2, DataType.FLOAT, dt ); }) );

auto img = Image( ivec2(3,3), ElemInfo( 3, DataType.NORM_FIXED ) );
assert( mustExcept({ auto d = img.mapAs!vec2; }) );

assert( !mustExcept({ img.pixel!vec3(1,0) = vec3(1,1,1); }) );
assert(  mustExcept({ img.pixel!vec2(1,0) = vec2(1,1); }) );
static assert(  !__traits(compiles, { img.pixel!vec3(4,4) = vec3(1,1); }) );

Meta