Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6595139

Browse files
committed
Merge pull request#5718 from mdboom/image-interpolation
Rewrite of image infrastructureConflicts:lib/matplotlib/tests/test_axes.py - do not back-port appveyor spceific limitslib/matplotlib/tests/test_image.py - do not backport the jpeg_alpha testsetupext.py - do not include windows/appveyor related changes
1 parentc27dd78 commit6595139

File tree

152 files changed

+13992
-12746
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

152 files changed

+13992
-12746
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Change in the ``draw_image`` backend API
2+
----------------------------------------
3+
4+
The ``draw_image`` method implemented by backends has changed its interface.
5+
6+
This change is only relevant if the backend declares that it is able
7+
to transform images by returning ``True`` from ``option_scale_image``.
8+
See the ``draw_image`` docstring for more information.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Improved image support
2+
----------------------
3+
4+
Prior to version 2.0, matplotlib resampled images by first applying
5+
the color map and then resizing the result. Since the resampling was
6+
performed on the colored image, this introduced colors in the output
7+
image that didn't actually exist in the color map. Now, images are
8+
resampled first (and entirely in floating-point, if the input image is
9+
floating-point), and then the color map is applied.
10+
11+
In order to make this important change, the image handling code was
12+
almost entirely rewritten. As a side effect, image resampling uses
13+
less memory and fewer datatype conversions than before.
14+
15+
The experimental private feature where one could "skew" an image by
16+
setting the private member ``_image_skew_coordinate`` has been
17+
removed. Instead, images will obey the transform of the axes on which
18+
they are drawn.

‎doc/users/whats_new/rcparams.rst‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,20 @@ Configuration (rcParams)
1919
|`svg.hashsalt`| see note|
2020
+----------------------------+--------------------------------------------------+
2121

22-
``svg.hashsalt``
23-
````````````````
22+
Added``svg.hashsalt`` key to rcParams
23+
```````````````````````````````````````
2424

2525
If ``svg.hashsalt`` is ``None`` (which it is by default), the svg
2626
backend uses ``uuid4`` to generate the hash salt. If it is not
2727
``None``, it must be a string that is used as the hash salt instead of
2828
``uuid4``. This allows for deterministic SVG output.
29+
30+
31+
Removed the ``svg.image_noscale`` rcParam
32+
`````````````````````````````````````````
33+
34+
As a result of the extensive changes to image handling, the
35+
``svg.image_noscale`` rcParam has been removed. The same
36+
functionality may be achieved by setting ``interpolation='none'`` on
37+
individual images or globally using the ``image.interpolation``
38+
rcParam.

‎examples/api/demo_affine_image.py‎

100755100644
Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#!/usr/bin/env python
2-
3-
41
"""
52
For the backends that supports draw_image with optional affine
63
transform (e.g., agg, ps backend), the image of the output should
@@ -24,22 +21,15 @@ def get_image():
2421
returnZ
2522

2623

27-
defimshow_affine(ax,z,*kl,**kwargs):
28-
im=ax.imshow(z,*kl,**kwargs)
29-
x1,x2,y1,y2=im.get_extent()
30-
im._image_skew_coordinate= (x2,y1)
31-
returnim
32-
33-
3424
if1:
3525

3626
# image rotation
3727

38-
fig,(ax1,ax2)=plt.subplots(1,2)
28+
fig,ax1=plt.subplots(1,1)
3929
Z=get_image()
40-
im1=imshow_affine(ax1,Z,interpolation='none',
41-
origin='lower',
42-
extent=[-2,4,-3,2],clip_on=True)
30+
im1=ax1.imshow(Z,interpolation='none',
31+
origin='lower',
32+
extent=[-2,4,-3,2],clip_on=True)
4333

4434
trans_data2=mtransforms.Affine2D().rotate_deg(30)+ax1.transData
4535
im1.set_transform(trans_data2)
@@ -53,13 +43,3 @@ def imshow_affine(ax, z, *kl, **kwargs):
5343

5444
ax1.set_xlim(-3,5)
5545
ax1.set_ylim(-4,4)
56-
57-
# image skew
58-
59-
im2=ax2.imshow(Z,interpolation='none',
60-
origin='lower',
61-
extent=[-2,4,-3,2],clip_on=True)
62-
im2._image_skew_coordinate= (3,-2)
63-
64-
plt.show()
65-
#plt.savefig("demo_affine_image")

‎examples/images_contours_and_fields/interpolation_methods.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
'spline36','hanning','hamming','hermite','kaiser','quadric',
1919
'catrom','gaussian','bessel','mitchell','sinc','lanczos']
2020

21+
np.random.seed(0)
2122
grid=np.random.rand(4,4)
2223

2324
fig,axes=plt.subplots(3,6,figsize=(12,6),
@@ -26,7 +27,7 @@
2627
fig.subplots_adjust(hspace=0.3,wspace=0.05)
2728

2829
forax,interp_methodinzip(axes.flat,methods):
29-
ax.imshow(grid,interpolation=interp_method)
30+
ax.imshow(grid,interpolation=interp_method,cmap='viridis')
3031
ax.set_title(interp_method)
3132

3233
plt.show()

‎examples/pylab_examples/demo_annotation_box.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848

4949
arr=np.arange(100).reshape((10,10))
5050
im=OffsetImage(arr,zoom=2)
51+
im.image.axes=ax
5152

5253
ab=AnnotationBbox(im,xy,
5354
xybox=(-50.,50.),
@@ -62,9 +63,10 @@
6263

6364
frommatplotlib._pngimportread_png
6465
fn=get_sample_data("grace_hopper.png",asfileobj=False)
65-
arr_lena=read_png(fn)
66+
arr_img=read_png(fn)
6667

67-
imagebox=OffsetImage(arr_lena,zoom=0.2)
68+
imagebox=OffsetImage(arr_img,zoom=0.2)
69+
imagebox.image.axes=ax
6870

6971
ab=AnnotationBbox(imagebox,xy,
7072
xybox=(120.,-80.),

‎extern/agg24-svn/include/agg_span_image_filter_gray.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ namespace agg
490490
fg_ptr = (const value_type*)base_type::source().next_y();
491491
}
492492

493-
fg>>=image_filter_shift;
493+
fg=color_type::downshift(fg,image_filter_shift);
494494
if(fg <0) fg =0;
495495
if(fg >color_type::full_value()) fg =color_type::full_value();
496496
span->v = (value_type)fg;

‎lib/matplotlib/__init__.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,7 @@ def matplotlib_fname():
842842
'savefig.extension': ('savefig.format',lambdax:x,None),
843843
'axes.color_cycle': ('axes.prop_cycle',lambdax:cycler('color',x),
844844
lambdax: [c.get('color',None)forcinx]),
845+
'svg.image_noscale': ('image.interpolation',None,None),
845846
}
846847

847848
_deprecated_ignore_map= {

‎lib/matplotlib/axes/_base.py‎

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2321,15 +2321,6 @@ def draw(self, renderer=None, inframe=False):
23212321
artists.remove(self._left_title)
23222322
artists.remove(self._right_title)
23232323

2324-
# add images to dsu if the backend supports compositing.
2325-
# otherwise, does the manual compositing without adding images to dsu.
2326-
iflen(self.images)<=1orrenderer.option_image_nocomposite():
2327-
_do_composite=False
2328-
else:
2329-
_do_composite=True
2330-
foriminself.images:
2331-
artists.remove(im)
2332-
23332324
ifself.figure.canvas.is_saving():
23342325
dsu= [(a.zorder,a)forainartists]
23352326
else:
@@ -2354,46 +2345,12 @@ def draw(self, renderer=None, inframe=False):
23542345
ifself.axisonandself._frameon:
23552346
self.patch.draw(renderer)
23562347

2357-
if_do_composite:
2358-
# make a composite image, blending alpha
2359-
# list of (mimage.Image, ox, oy)
2360-
2361-
zorder_images= [(im.zorder,im)foriminself.images
2362-
ifim.get_visible()]
2363-
zorder_images.sort(key=lambdax:x[0])
2364-
2365-
mag=renderer.get_image_magnification()
2366-
ims= [(im.make_image(mag),0,0,im.get_alpha())
2367-
forz,iminzorder_images]
2368-
2369-
l,b,r,t=self.bbox.extents
2370-
width=int(mag* ((np.round(r)+0.5)- (np.round(l)-0.5)))
2371-
height=int(mag* ((np.round(t)+0.5)- (np.round(b)-0.5)))
2372-
im=mimage.from_images(height,
2373-
width,
2374-
ims)
2375-
2376-
im.is_grayscale=False
2377-
l,b,w,h=self.bbox.bounds
2378-
# composite images need special args so they will not
2379-
# respect z-order for now
2380-
2381-
gc=renderer.new_gc()
2382-
gc.set_clip_rectangle(self.bbox)
2383-
gc.set_clip_path(mtransforms.TransformedPath(
2384-
self.patch.get_path(),
2385-
self.patch.get_transform()))
2386-
2387-
renderer.draw_image(gc,round(l),round(b),im)
2388-
gc.restore()
2389-
23902348
ifdsu_rasterized:
23912349
forzorder,aindsu_rasterized:
23922350
a.draw(renderer)
23932351
renderer.stop_rasterizing()
23942352

2395-
forzorder,aindsu:
2396-
a.draw(renderer)
2353+
mimage._draw_list_compositing_images(renderer,self,dsu)
23972354

23982355
renderer.close_group('axes')
23992356
self._cachedRenderer=renderer

‎lib/matplotlib/backend_bases.py‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ def get_image_magnification(self):
515515
"""
516516
return1.0
517517

518-
defdraw_image(self,gc,x,y,im):
518+
defdraw_image(self,gc,x,y,im,trans=None):
519519
"""
520520
Draw the image instance into the current axes;
521521
@@ -531,7 +531,14 @@ def draw_image(self, gc, x, y, im):
531531
is the distance from bottom
532532
533533
*im*
534-
the :class:`matplotlib._image.Image` instance
534+
An NxMx4 array of RGBA pixels (of dtype uint8).
535+
536+
*trans*
537+
If the concrete backend is written such that
538+
`option_scale_image` returns `True`, an affine
539+
transformation may also be passed to `draw_image`. The
540+
backend should apply the transformation to the image
541+
before applying the translation of `x` and `y`.
535542
"""
536543
raiseNotImplementedError
537544

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp