meta-for BWIntegralImage also as IBWIntegralImage {

  static byte[] scaledGrayBytesFromBWIntegralImage(int w, BWIntegralImage img) {
    ret scaledGrayBytesFromBWIntegralImage(img, w);
  }
  
  static byte[] scaledGrayBytesFromBWIntegralImage(BWIntegralImage img, int w, int h default heightForWidth(img, w)) {
    int w1 = img.getWidth(), h1 = img.getHeight();
    double stepX = doubleRatio(w1, w), stepY = doubleRatio(h1, h);
    byte[] pixels = new[w*h];
    int i = 0;
    double srcY = 0;
    
    if (stepX == 1 && stepY == 1) {
      // No scaling
      
      for y to h:
        for x to w: {
          int pixel = img.getPixelBrightness(x, y);
          pixels[i++] = clampToUByte(pixel);
        }
    } else {
      // With arbitrary scaling
      
      for y to h: {
        double srcX = 0, nextSrcY = srcY+stepY;
        
        for x to w: {
          double nextSrcX = srcX+stepX;
          int pixel = iround(img.getPixelAverage(srcX, srcY, nextSrcX, nextSrcY));
          pixels[i++] = clampToUByte(pixel);
          srcX = nextSrcX;
        }
        srcY = nextSrcY;
      }
    }
    
    ret pixels;
  }

}