-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Svg rasterize resolution fix #1185
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
309c93c
cb1aa37
868f411
98ab64e
7eacb85
f56a455
c610462
dc0a819
d6f4931
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -244,10 +244,11 @@ class RendererSVG(RendererBase): | |
FONT_SCALE = 100.0 | ||
fontd = maxdict(50) | ||
|
||
def __init__(self, width, height, svgwriter, basename=None): | ||
def __init__(self, width, height, svgwriter, basename=None, image_dpi=72): | ||
self.width = width | ||
self.height = height | ||
self.writer = XMLWriter(svgwriter) | ||
self.image_dpi = image_dpi # the actual dpi we want to rasterize stuff with | ||
|
||
self._groupd = {} | ||
if not rcParams['svg.image_inline']: | ||
|
@@ -733,6 +734,9 @@ def draw_gouraud_triangles(self, gc, triangles_array, colors_array, | |
def option_scale_image(self): | ||
return True | ||
|
||
def get_image_magnification(self): | ||
return self.image_dpi/72.0 | ||
|
||
def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @mwelter - I don't know how much you've invested in checking out the details of this signature but it is worth noting that all backends have it, except for the I promise that PR wont take 8 months to merge 😉 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nah, sorry. I happly contribute what i have done. But at the moment i am not willing to look into more stuff. |
||
attrib = {} | ||
clipid = self._get_clip(gc) | ||
|
@@ -755,6 +759,17 @@ def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None): | |
im.resize(numcols, numrows) | ||
|
||
h,w = im.get_size_out() | ||
|
||
if dx is None: | ||
w = 72.0*w/self.image_dpi | ||
else: | ||
w = dx | ||
|
||
if dy is None: | ||
h = 72.0*h/self.image_dpi | ||
else: | ||
h = dy | ||
|
||
oid = getattr(im, '_gid', None) | ||
url = getattr(im, '_url', None) | ||
if url is not None: | ||
|
@@ -1113,25 +1128,17 @@ def print_svgz(self, filename, *args, **kwargs): | |
|
||
def _print_svg(self, filename, svgwriter, fh_to_close=None, **kwargs): | ||
try: | ||
image_dpi = kwargs.pop("dpi", 72) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What's the difference between this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This code is in a different class. From here image_dpi gets passed to the backends constructor. |
||
self.figure.set_dpi(72.0) | ||
width, height = self.figure.get_size_inches() | ||
w, h = width*72, height*72 | ||
|
||
if rcParams['svg.image_noscale']: | ||
renderer = RendererSVG(w, h, svgwriter, filename) | ||
renderer = RendererSVG(w, h, svgwriter, filename, image_dpi) | ||
else: | ||
# setting mixed renderer dpi other than 72 results in | ||
# incorrect size of the rasterized image. It seems that the | ||
# svg internally uses fixed dpi of 72 and seems to cause | ||
# the problem. I hope someone who knows the svg backends | ||
# take a look at this problem. Meanwhile, the dpi | ||
# parameter is ignored and image_dpi is fixed at 72. - JJL | ||
|
||
#image_dpi = kwargs.pop("dpi", 72) | ||
image_dpi = 72 | ||
_bbox_inches_restore = kwargs.pop("bbox_inches_restore", None) | ||
renderer = MixedModeRenderer(self.figure, | ||
width, height, image_dpi, RendererSVG(w, h, svgwriter, filename), | ||
width, height, image_dpi, RendererSVG(w, h, svgwriter, filename, image_dpi), | ||
bbox_inches_restore=_bbox_inches_restore) | ||
|
||
self.figure.draw(renderer) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nitpick: Only need a single new line between methods.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok