Import your "image as plane", in your material nodes (cycles) select the image and add a "texture coordinates" node, plug the "generated" input to the vector of you image.

Now edit your object (tab in 3D view), Change the selection mode to vertices+faces with Shift+LMB.

Note: The next part can be done instead with the following script.
import bpy
import bmesh
# select, duplicate, and delete face
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.duplicate_move()
bpy.ops.mesh.delete(type='ONLY_FACE')
bpy.ops.object.mode_set(mode='OBJECT')
# select the face
mesh = bpy.context.object.data
bm = bmesh.new()
bm.from_mesh(mesh)
bm.faces.ensure_lookup_table()
bm.faces[0].select = True
bm.to_mesh(mesh)
bm.free()
bpy.ops.object.mode_set(mode='EDIT')
# select the verts in the corners
bpy.ops.mesh.select_all(action='INVERT')
bpy.ops.mesh.hide(unselected=False)
Select all with A then duplicate with Shift+D, hit X and select "only faces".
Now click in the middle of your object to select the face, Ctrl+I to invert the selection (select the vertices of the deleted face) and hit H to hide the remaining vertices. They will act as invisible bounds for your texture mapping, but you don't want to select them (or modify them), that's why we hide them.
Now you can do anything inside your object (add/remove/move/rotate/scale faces/edges/vertices) as long as you keep them inside the original bounds.
If you need to see the borders in edit mode, go in properties panel, object tab and check "texture space".

Work in material view to see it in real time.

Basically, the image as plane creates a plane mesh with the image's XY ratio and UV unwrap it, so UV=Generated coordinates inside the original mesh bounds.