diff --git a/src/ol/Image.js b/src/ol/Image.js index 66602f03cb..71ee355408 100644 --- a/src/ol/Image.js +++ b/src/ol/Image.js @@ -136,6 +136,7 @@ class ImageWrapper extends ImageBase { */ setImage(image) { this.image_ = image; + this.resolution = getHeight(this.extent) / this.image_.height; } /** diff --git a/src/ol/source/ImageStatic.js b/src/ol/source/ImageStatic.js index 9629cdde78..e002557efc 100644 --- a/src/ol/source/ImageStatic.js +++ b/src/ol/source/ImageStatic.js @@ -135,10 +135,19 @@ class Static extends ImageSource { imageWidth = image.width; imageHeight = image.height; } - const resolution = getHeight(imageExtent) / imageHeight; - const targetWidth = Math.ceil(getWidth(imageExtent) / resolution); - if (targetWidth != imageWidth) { - const context = createCanvasContext2D(targetWidth, imageHeight); + const extentWidth = getWidth(imageExtent); + const extentHeight = getHeight(imageExtent); + const xResolution = extentWidth / imageWidth; + const yResolution = extentHeight / imageHeight; + let targetWidth = imageWidth; + let targetHeight = imageHeight; + if (xResolution > yResolution) { + targetWidth = Math.round(extentWidth / yResolution); + } else { + targetHeight = Math.round(extentHeight / xResolution); + } + if (targetWidth !== imageWidth || targetHeight !== imageHeight) { + const context = createCanvasContext2D(targetWidth, targetHeight); assign(context, this.getContextOptions()); const canvas = context.canvas; context.drawImage( diff --git a/test/browser/spec/ol/source/imagestatic.test.js b/test/browser/spec/ol/source/imagestatic.test.js index c705800885..fb1c0dc4bc 100644 --- a/test/browser/spec/ol/source/imagestatic.test.js +++ b/test/browser/spec/ol/source/imagestatic.test.js @@ -16,7 +16,7 @@ describe('ol.source.ImageStatic', function () { }); describe('#getImage', function () { - it('scales image to fit imageExtent', function (done) { + it('scales image height to fit imageExtent', function (done) { const source = new Static({ url: 'spec/ol/source/images/12-655-1583.png', imageExtent: [ @@ -31,7 +31,30 @@ describe('ol.source.ImageStatic', function () { const image = source.getImage(extent, resolution, pixelRatio, projection); source.on('imageloadend', function (event) { - expect(image.getImage().width).to.be(128); + expect(image.getImage().width).to.be(256); + expect(image.getImage().height).to.be(512); + done(); + }); + + image.load(); + }); + + it('scales image width to fit imageExtent', function (done) { + const source = new Static({ + url: 'spec/ol/source/images/12-655-1583.png', + imageExtent: [ + -13629027.891360067, + 4539747.983913189, + -13609460.012119063, + 4549531.923533691, + ], + projection: projection, + }); + + const image = source.getImage(extent, resolution, pixelRatio, projection); + + source.on('imageloadend', function (event) { + expect(image.getImage().width).to.be(512); expect(image.getImage().height).to.be(256); done(); }); @@ -55,8 +78,8 @@ describe('ol.source.ImageStatic', function () { const image = source.getImage(extent, resolution, pixelRatio, projection); source.on('imageloadend', function (event) { - expect(image.getImage().width).to.be(127); - expect(image.getImage().height).to.be(254); + expect(image.getImage().width).to.be(254); + expect(image.getImage().height).to.be(508); done(); }); diff --git a/test/rendering/cases/image-stretched-disable-smoothing/expected.png b/test/rendering/cases/image-stretched-disable-smoothing/expected.png index a8d03e6f35..8121f09e86 100644 Binary files a/test/rendering/cases/image-stretched-disable-smoothing/expected.png and b/test/rendering/cases/image-stretched-disable-smoothing/expected.png differ diff --git a/test/rendering/cases/reproj-image-stretched-disable-smoothing/expected.png b/test/rendering/cases/reproj-image-stretched-disable-smoothing/expected.png index cc20c9d668..2a6b3aa259 100644 Binary files a/test/rendering/cases/reproj-image-stretched-disable-smoothing/expected.png and b/test/rendering/cases/reproj-image-stretched-disable-smoothing/expected.png differ diff --git a/test/rendering/cases/reproj-image/expected.png b/test/rendering/cases/reproj-image/expected.png index 11d43132b9..e56de31db1 100644 Binary files a/test/rendering/cases/reproj-image/expected.png and b/test/rendering/cases/reproj-image/expected.png differ