added new_from_image() to python
and tests
This commit is contained in:
parent
7882602dfe
commit
04353f8915
@ -2,6 +2,7 @@
|
|||||||
- supports fits images with leading non-image HDUs, thanks benepo
|
- supports fits images with leading non-image HDUs, thanks benepo
|
||||||
- add vips_image_new_from_image() and vips_image_new_from_image1() ... make a
|
- add vips_image_new_from_image() and vips_image_new_from_image1() ... make a
|
||||||
constant image
|
constant image
|
||||||
|
- add new_from_image() to Python as well
|
||||||
|
|
||||||
23/4/17 started 8.5.5
|
23/4/17 started 8.5.5
|
||||||
- doc polishing
|
- doc polishing
|
||||||
|
9
TODO
9
TODO
@ -1,13 +1,14 @@
|
|||||||
- can we change VImage::new_from_image() to not inherit bands? too awkward to
|
- Add new_from_image() to C++
|
||||||
make a one-band image
|
|
||||||
|
|
||||||
needs some docs
|
needs docs
|
||||||
|
|
||||||
add to python, C, ruby, php etc etc
|
also check php, ruby
|
||||||
|
|
||||||
- does cpp image.bandjoin(12) work? how about
|
- does cpp image.bandjoin(12) work? how about
|
||||||
bandjoin(std::vector<double>({1, 2}))
|
bandjoin(std::vector<double>({1, 2}))
|
||||||
|
|
||||||
|
check bandjoin_const use in Python too
|
||||||
|
|
||||||
- not sure about utf8 error messages on win
|
- not sure about utf8 error messages on win
|
||||||
|
|
||||||
- strange:
|
- strange:
|
||||||
|
@ -162,8 +162,8 @@ im = Vips.Image.new_from_file(sys.argv[1], access = Vips.Access.SEQUENTIAL)
|
|||||||
for each file format. The C equivalent to this function,
|
for each file format. The C equivalent to this function,
|
||||||
vips_image_new_from_file(), has more extensive documentation. Try
|
vips_image_new_from_file(), has more extensive documentation. Try
|
||||||
<code>help(Vips.Image)</code> to see a list of all the image
|
<code>help(Vips.Image)</code> to see a list of all the image
|
||||||
constructors --- you can load from memory, or create from an array,
|
constructors --- you can load from memory, create from an array,
|
||||||
for example.
|
or create from a constant, for example.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
@ -91,13 +91,7 @@ def imageize(match_image, value):
|
|||||||
|
|
||||||
# assume this is a pixel constant ... expand into an image using
|
# assume this is a pixel constant ... expand into an image using
|
||||||
# match as a template
|
# match as a template
|
||||||
pixel = (Vips.Image.black(1, 1) + value).cast(match_image.format)
|
return match_image.new_from_image(value)
|
||||||
image = pixel.embed(0, 0, match_image.width, match_image.height,
|
|
||||||
extend = Vips.Extend.COPY)
|
|
||||||
image = image.copy(interpretation = match_image.interpretation,
|
|
||||||
xres = match_image.xres,
|
|
||||||
yres = match_image.yres)
|
|
||||||
return image
|
|
||||||
|
|
||||||
# we'd like to use memoryview to avoid copying things like ICC profiles, but
|
# we'd like to use memoryview to avoid copying things like ICC profiles, but
|
||||||
# unfortunately pygobject does not support this ... so for blobs we just use
|
# unfortunately pygobject does not support this ... so for blobs we just use
|
||||||
@ -621,6 +615,29 @@ def add_doc(value):
|
|||||||
class Image(Vips.Image):
|
class Image(Vips.Image):
|
||||||
# for constructors, see class methods above
|
# for constructors, see class methods above
|
||||||
|
|
||||||
|
def new_from_image(self, value):
|
||||||
|
"""Create a new image based on an existing one.
|
||||||
|
|
||||||
|
A new image is created with the same width, height, format,
|
||||||
|
interpretation, resolution and offset as self, but with every pixel
|
||||||
|
having the value of value.
|
||||||
|
|
||||||
|
You can pass an array to create a many-band image.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# we'd like to call the vips function vips_image_new_from_image() but we
|
||||||
|
# can't call __getattr__ methods from a subclass
|
||||||
|
pixel = (Vips.Image.black(1, 1) + value).cast(self.format)
|
||||||
|
image = pixel.embed(0, 0, self.width, self.height,
|
||||||
|
extend = Vips.Extend.COPY)
|
||||||
|
image = image.copy(interpretation = self.interpretation,
|
||||||
|
xres = self.xres,
|
||||||
|
yres = self.yres,
|
||||||
|
xoffset = self.xoffset,
|
||||||
|
yoffset = self.yoffset)
|
||||||
|
|
||||||
|
return image
|
||||||
|
|
||||||
# output
|
# output
|
||||||
|
|
||||||
def write_to_file(self, vips_filename, **kwargs):
|
def write_to_file(self, vips_filename, **kwargs):
|
||||||
|
@ -62,5 +62,27 @@ class TestIofuncs(unittest.TestCase):
|
|||||||
for case in cases:
|
for case in cases:
|
||||||
self.assertEqualObjects(split(case[0]), case[1])
|
self.assertEqualObjects(split(case[0]), case[1])
|
||||||
|
|
||||||
|
def test_new_from_image(self):
|
||||||
|
im = Vips.Image.mask_ideal(100, 100, 0.5, reject = True, optical = True)
|
||||||
|
|
||||||
|
im2 = im.new_from_image(12)
|
||||||
|
|
||||||
|
self.assertEqual(im2.width, im.width)
|
||||||
|
self.assertEqual(im2.height, im.height)
|
||||||
|
self.assertEqual(im2.interpretation, im.interpretation)
|
||||||
|
self.assertEqual(im2.format, im.format)
|
||||||
|
self.assertEqual(im2.xres, im.xres)
|
||||||
|
self.assertEqual(im2.yres, im.yres)
|
||||||
|
self.assertEqual(im2.xoffset, im.xoffset)
|
||||||
|
self.assertEqual(im2.yoffset, im.yoffset)
|
||||||
|
self.assertEqual(im2.bands, 1)
|
||||||
|
self.assertEqual(im2.avg(), 12)
|
||||||
|
|
||||||
|
im2 = im.new_from_image([1,2,3])
|
||||||
|
|
||||||
|
self.assertEqual(im2.bands, 3)
|
||||||
|
self.assertEqual(im2.avg(), 2)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
Reference in New Issue
Block a user