getImageInternal(extent, resolution, pixelRatio, projection) {
    if (this.loader) {
      const requestExtent = getRequestExtent(extent, resolution, pixelRatio, 1);
      const requestResolution = this.findNearestResolution(resolution);
      if (
        this.image &&
        (this.static_ ||
          (this.wantedProjection_ === projection &&
            ((this.wantedExtent_ &&
              containsExtent(this.wantedExtent_, requestExtent)) ||
              containsExtent(this.image.getExtent(), requestExtent)) &&
            ((this.wantedResolution_ &&
              fromResolutionLike(this.wantedResolution_) ===
                requestResolution) ||
              fromResolutionLike(this.image.getResolution()) ===
                requestResolution)))
      ) {
        return this.image;
      }
      this.wantedProjection_ = projection;
      this.wantedExtent_ = requestExtent;
      this.wantedResolution_ = requestResolution;
      this.image = new ImageWrapper(
        requestExtent,
        requestResolution,
        pixelRatio,
        this.loader,
      );
      this.image.addEventListener(
        EventType.CHANGE,
        this.handleImageChange.bind(this),
      );
    }
    return this.image;
  }
@abstract
@param {import("../extent.js").Extent} extent Extent.
@param {number} resolution Resolution.
@param {number} pixelRatio Pixel ratio.
@param {import("../proj/Projection.js").default} projection Projection.
@return {import("../Image.js").default} Single image.
@protected