Unlike SugarCube, Harlowe doesn't have built in image support or modals, so you've chosen an uphill battle here. Regardless, I've found that the easiest (but not likely best) way to do this is to essentially use jQuery to map the action of the element to a hidden link. This is a sneaky, hacky workaround more than a solution.
To do this, create your Harlowe link as normal using link markup or a (link:)-style macro (don't use (click:)), and wrap it in a hidden named hook:
|dummylink)[(link: "dummy")[
<!-- code here -->
]]
Next, you need to use a script element and jQuery to cause clicking on your image element to fire the link. To accomplish this, you need a way to target that image. Giving it an "id" attribute is probably easiest.
<img id='modal-button' role='button' tabindex='0' src='url/to/your/image.png' />
You should probably set the tabindex and role as above to maintain accessibility.
Now for the jQuery:
<script>
setTimeout( function () {
$('img#modal-button').on('click', function (ev) {
ev.preventDefault();
$('tw-hook[name=dummylink] tw-link').trigger('click');
});
}, 40);
</script>
I wrote this from memory, so it may contain stupid mistakes or syntax errors, but that's the general concept.
You can also trick the parser into rendering html code (like <img>) inside macros and markup links, but I've had issues with getting that to work consistently, and it will probably not be good for accessibility.