C/C++ done

python next
This commit is contained in:
John Cupitt 2017-04-26 14:52:28 +01:00
parent b0f8246c90
commit 7882602dfe
7 changed files with 128 additions and 35 deletions

View File

@ -1,5 +1,7 @@
15/4/17 started 8.6.0
- supports fits images with leading non-image HDUs, thanks benepo
- add vips_image_new_from_image() and vips_image_new_from_image1() ... make a
constant image
23/4/17 started 8.5.5
- doc polishing

10
TODO
View File

@ -1,3 +1,13 @@
- can we change VImage::new_from_image() to not inherit bands? too awkward to
make a one-band image
needs some docs
add to python, C, ruby, php etc etc
- does cpp image.bandjoin(12) work? how about
bandjoin(std::vector<double>({1, 2}))
- not sure about utf8 error messages on win
- strange:

View File

@ -565,34 +565,6 @@ VImage::new_from_buffer( void *buf, size_t len, const char *option_string,
return( out );
}
VImage
VImage::new_from_image( std::vector<double> pixel )
{
VImage onepx = VImage::black( 1, 1,
VImage::option()->set( "bands", bands() ) );
onepx = (onepx + pixel).cast( format() );
VImage big = onepx.embed( 0, 0, width(), height(),
VImage::option()->set( "extend", VIPS_EXTEND_COPY ) );
big = big.copy(
VImage::option()->
set( "interpretation", interpretation() )->
set( "xres", xres() )->
set( "yres", yres() )->
set( "xoffset", xres() )->
set( "yoffset", yres() ) );
return( big );
}
VImage
VImage::new_from_image( double pixel )
{
return( new_from_image( to_vectorv( 1, pixel ) ) );
}
VImage
VImage::new_matrix( int width, int height )
{
@ -693,10 +665,10 @@ VImage::bandsplit( VOption *options )
VImage
VImage::bandjoin( VImage other, VOption *options )
{
VImage v[2] = { *this, other };
std::vector<VImage> vec( v, v + VIPS_NUMBER( v ) );
VImage v[2] = { *this, other };
std::vector<VImage> vec( v, v + VIPS_NUMBER( v ) );
return( bandjoin( vec, options ) );
return( bandjoin( vec, options ) );
}
std::complex<double>

View File

@ -468,8 +468,21 @@ public:
static VImage new_matrixv( int width, int height, ... );
VImage new_from_image( std::vector<double> pixel );
VImage new_from_image( double pixel );
VImage new_from_image( std::vector<double> pixel )
{
VipsImage *image;
if( !(image = vips_image_new_from_image( this->get_image(),
&pixel[0], pixel.size() )) )
throw( VError() );
return( VImage( image ) );
}
VImage new_from_image( double pixel )
{
return( new_from_image( to_vectorv( 1, pixel ) ) );
}
VImage write( VImage out );

View File

@ -134,11 +134,30 @@ main( int argc, char **argv )
There are a series of similar constructors which parallel the other
constructors in the C API, see VImage::new_from_memory(),
VImage::new_from_buffer(), and VImage::new_matrix(). There's also
VImage::new_from_buffer(), and VImage::new_matrix().
</para>
<para>
The convenience function `VImage::new_from_image()` makes a constant
image from an existing image. The image it returns will have the same
size, interpretation, resolution and format as the image you call it on,
but with every pixel having the constant value you specify. For example:
<programlisting language="cpp">
new_image = image.new_from_image(12);
</programlisting>
Now `new_image` has the same size as `image`, but has one band, and every
pixel has the value 12. You can pass a `std::vector<double>` as the
argument to make a constant image with a different number of bands.
</para>
<para>
There's also
VImage::new_memory() and VImage::new_temp_file(), which when written to
with VImage::write() will create whole images on memory or on disc.
</para>
<para>
The next line finds the average pixel value, it's the equivalent of the
vips_avg() function. The differences from the C API are:

View File

@ -452,6 +452,9 @@ VipsImage *vips_image_new_matrix_from_array( int width, int height,
const double *array, int size );
VipsImage *vips_image_matrix_from_array( int width, int height,
const double *array, int size );
VipsImage *vips_image_new_from_image( VipsImage *image, const double *c, int n );
VipsImage *vips_image_new_from_image1( VipsImage *image, double c );
void vips_image_set_delete_on_close( VipsImage *image,
gboolean delete_on_close );
guint64 vips_get_disc_threshold( void );

View File

@ -2292,6 +2292,80 @@ vips_image_matrix_from_array( int width, int height,
array, size ) );
}
/**
* vips_image_new_from_image:
* @image: image to copy
* @c: (array length=n) (transfer none): array of constants
* @n: number of constants
*
* Creates a new image with width, height, format, interpretation, resolution
* and offset taken from @image, but with number of bands taken from @n and the
* value of each band element set from @c.
*
* See also: vips_image_new_from_image1()
*
* Returns: (transfer full): the new #VipsImage, or %NULL on error.
*/
VipsImage *
vips_image_new_from_image( VipsImage *image, const double *c, int n )
{
VipsObject *scope = (VipsObject *) vips_image_new();
VipsImage **t = (VipsImage **) vips_object_local_array( scope, 5 );
double *ones;
int i;
VipsImage *result;
if( !(ones = VIPS_ARRAY( scope, n, double )) ) {
g_object_unref( scope );
return( NULL );
}
for( i = 0; i < n; i++ )
ones[i] = 1.0;
if( vips_black( &t[0], 1, 1, NULL ) ||
vips_linear( t[0], &t[1], ones, (double *) c, n, NULL ) ||
vips_cast( t[1], &t[2], image->BandFmt, NULL ) ||
vips_embed( t[2], &t[3], 0, 0, image->Xsize, image->Ysize,
"extend", VIPS_EXTEND_COPY, NULL ) ||
vips_copy( t[3], &t[4],
"interpretation", image->Type,
"xres", image->Xres,
"yres", image->Yres,
"xoffset", image->Xoffset,
"yoffset", image->Yoffset,
NULL ) ) {
g_object_unref( scope );
return( NULL );
}
result = t[4];
g_object_ref( result );
g_object_unref( scope );
return( result );
}
/**
* vips_image_new_from_image1:
* @image: image to copy
* @c: constants
*
* Creates a new image with width, height, format, interpretation, resolution
* and offset taken from @image, but with one band and each pixel having the
* value @c.
*
* See also: vips_image_new_from_image()
*
* Returns: (transfer full): the new #VipsImage, or %NULL on error.
*/
VipsImage *
vips_image_new_from_image1( VipsImage *image, double c )
{
return( vips_image_new_from_image( image, (const double *) &c, 1 ) );
}
/**
* vips_image_set_delete_on_close:
* @image: image to set