jlait
Transform 2d has a "Rasterize" toggle. If you turn this off, it moves the image in world space so you can line things up where you want them to go.
Indeed, disabling rasterize saves the situation, but it's so unintuitive that you absolutely need to explain it in the help. I'm sure 99% of users don't know how to use it. The main problem there is scaling. I spent several evenings (!) experimenting with this and still didn't understand rasterize. But after your explanation, I checked it again and finally understood.
Below is an explanation for beginners.
So, the task is: we have a small icon, say 20x20, and we want to place it on a 1024 canvas. A simple blend will stretch the icon to fill the canvas and resample it to 1024 resolution. That is, we need to scale it down by a factor of 50. If we decide to scale it down first, the default transform with rasterize enabled will turn your icon into a blur of a couple of pixels. And then the blend will scale that blur up by a factor of 50. A complete failure.
Disabling rasterization will preserve accuracy when scaling (similar to vector vs. raster), and decreasing the scaling before blending will preserve detail. However, this raises the issue of antialiasing at the edges after resampling within the blend. For a precisely drawn icon at a low resolution, this will unacceptably degrade the image.
Then it's better to enlarge the empty icon canvas before blending. Use crop, set the pixels, and set the right edge to the desired resolution and "discard and reframe" mode—the canvas will stretch. Now the canvases will overlap and fold without resampling, and the icon size will remain unchanged in pixels, eliminating antialiasing or transformation artifacts. The downside is that the transform handle will be in the center, while the icon is in the corner—this is very inconvenient. Instead of 0 and 1024, you should use -512 and +512 for the corners. Or an expression with a reference to a reference node and its resx and resy resolutions. And so we come to the point where, although the problem has a solution, it's so convoluted and labor-intensive that it's unviable.
An obvious, user-friendly solution would be to insert a crop wire from the reference image into the node, and our image would automatically add/crop canvas pixels to the sides (not resample), syncing the resolution to the background. Then the blend would work as expected, and our icon would immediately be centered along with the handle. And we wouldn't have to do any calculations for this simple operation or worry about changing the reference image's resolution. Everything would be procedural, just the way we like it.
The crop node already has a size_ref input, and I was hoping it was used for automatic cropping, but no, it doesn't work at all and has no effect on the resolution. Whether this is a bug or intended, I don't understand.