Fixed the math. #64
This commit is contained in:
parent
8450ccba5c
commit
4cdef991b9
1 changed files with 48 additions and 28 deletions
|
|
@ -3,34 +3,6 @@ How do I...?
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|
||||||
Create an image with an alpha layer?
|
|
||||||
====================================
|
|
||||||
::
|
|
||||||
|
|
||||||
>>> import numpy as np
|
|
||||||
>>> import glymur
|
|
||||||
>>> rgb = glymur.Jp2k(glymur.data.goodstuff()).read()
|
|
||||||
>>> lx, ly = rgb.shape[0:2]
|
|
||||||
>>> X, Y = np.ogrid[0:lx, 0:ly]
|
|
||||||
>>> mask = (X - lx / 2) ** 2 + (Y - ly / 2) ** 2 > lx * ly / 4
|
|
||||||
>>> alpha = 255 * np.ones((lx, ly, 1), dtype=np.uint8)
|
|
||||||
>>> alpha[mask] = 0
|
|
||||||
>>> rgba = np.concatenate((rgb, alpha), axis=2)
|
|
||||||
>>> jp2 = glymur.Jp2k('tmp.jp2', 'wb')
|
|
||||||
>>> jp2.write(rgba)
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
>>> boxes = jp2.box # The box attribute is the list of JP2 boxes
|
|
||||||
>>> index = [0, 1, 2, 3]
|
|
||||||
>>> ctype = [0, 0, 0, 1]
|
|
||||||
>>> asoc = [1, 2, 3, 0]
|
|
||||||
>>> cdef = glymur.jp2box.ChannelDefinitionBox(index, ctype, asoc)
|
|
||||||
>>> boxes[2].box.append(cdef)
|
|
||||||
>>> jp2_rgba = jp2.wrap("goodstuff_rgba.jp2", boxes=boxes)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Read the lowest resolution thumbnail?
|
Read the lowest resolution thumbnail?
|
||||||
=====================================
|
=====================================
|
||||||
Printing the Jp2k object should reveal the number of resolutions (look in the
|
Printing the Jp2k object should reveal the number of resolutions (look in the
|
||||||
|
|
@ -147,6 +119,54 @@ and add it after the JP2 header box, but before the codestream box ::
|
||||||
. (truncated)
|
. (truncated)
|
||||||
.
|
.
|
||||||
|
|
||||||
|
Create an image with an alpha layer?
|
||||||
|
====================================
|
||||||
|
|
||||||
|
OpenJPEG can create JP2 files with more than 3 components, but by default, any
|
||||||
|
extra components are not described. In order to specify an alpha layer as such,
|
||||||
|
we need to rewrap such an image in a set of boxes that includes a channel
|
||||||
|
definition box.
|
||||||
|
|
||||||
|
This example is based on SciPy example code found at
|
||||||
|
http://scipy-lectures.github.io/advanced/image_processing/#basic-manipulations . ::
|
||||||
|
|
||||||
|
>>> import numpy as np
|
||||||
|
>>> import glymur
|
||||||
|
>>> from glymur import Jp2k
|
||||||
|
>>> rgb = Jp2k(glymur.data.goodstuff()).read()
|
||||||
|
>>> lx, ly = rgb.shape[0:2]
|
||||||
|
>>> X, Y = np.ogrid[0:lx, 0:ly]
|
||||||
|
>>> mask = ly**2*(X - lx / 2) ** 2 + lx**2*(Y - ly / 2) ** 2 > (lx * ly / 2)**2
|
||||||
|
>>> alpha = 255 * np.ones((lx, ly, 1), dtype=np.uint8)
|
||||||
|
>>> alpha[mask] = 0
|
||||||
|
>>> rgba = np.concatenate((rgb, alpha), axis=2)
|
||||||
|
>>> jp2 = Jp2k('tmp.jp2', 'wb')
|
||||||
|
>>> jp2.write(rgba)
|
||||||
|
|
||||||
|
The first three channels are color channels, but the fourth will be identified
|
||||||
|
as an alpha channel::
|
||||||
|
|
||||||
|
>>> from glymur.core import COLOR, OPACITY
|
||||||
|
>>> ctype = [COLOR, COLOR, COLOR, OPACITY]
|
||||||
|
|
||||||
|
And finally we have to specify just exactly how each channel is to be
|
||||||
|
interpreted. The color channels are straightforward, but the alpha channel
|
||||||
|
in this case is to be applied against the entire image (it is possible to
|
||||||
|
apply an alpha channel to a single color channel, but we aren't doing that). ::
|
||||||
|
|
||||||
|
>>> from glymur.core import RED, GREEN, BLUE, WHOLE_IMAGE
|
||||||
|
>>> asoc = [RED, GREEN, BLUE, WHOLE_IMAGE]
|
||||||
|
>>> cdef = glymur.jp2box.ChannelDefinitionBox(channel_type=ctype, association=asoc)
|
||||||
|
|
||||||
|
It's easiest to take the existing jp2 jacket and just add the channel
|
||||||
|
definition box in the appropriate spot. The channel definition box **must**
|
||||||
|
go into the jp2 header box, and then we can rewrap the image. ::
|
||||||
|
|
||||||
|
>>> boxes = jp2.box # The box attribute is the list of JP2 boxes
|
||||||
|
>>> boxes[2].box.append(cdef)
|
||||||
|
>>> jp2_rgba = jp2.wrap("goodstuff_rgba.jp2", boxes=boxes)
|
||||||
|
|
||||||
|
|
||||||
Work with XMP UUIDs?
|
Work with XMP UUIDs?
|
||||||
====================
|
====================
|
||||||
The example JP2 file shipped with glymur has an XMP UUID. ::
|
The example JP2 file shipped with glymur has an XMP UUID. ::
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue