Vielen Dank für die Antworten!
Dazu darf ich auf folgende Frage im Support verweisen:
https://support.soscisurvey.de/?qa=18380/zeichenfunktion-mit-bild-als-untergrund
Wenn ich denselben Code wie in der verlinkten Frage nutze, tritt bei mir das gleiche Problem auf wie in der Frage beschrieben: Ich kann die Zeichenfunktion auf dem in der Zeichenfläche hochgeladenen Bild nicht nutzen. Das Problem unter https://support.soscisurvey.de/?qa=18380/zeichenfunktion-mit-bild-als-untergrund scheint gelöst worden zu sein, leider wurde jedoch kein Lösungsweg hinterlegt. 
Können Sie einen Fehler im folgenden Ausschnitt des Codes erkennen?
<div style="text-align: center;">
  <canvas id="%q.id%canvas" width="300" height="450" style="border: 1px solid #CCCCCC; "></canvas>
</div>
<!-- Note: Remove buttons as required -->
<div style="display: flex; justify-content: space-between; width: 300px; margin: 1em auto 2em;">
    <button type="button" id="%q.id%btnLineWidth = 2" title="Dünne Linie">Dünne Linie</button>
    <button type="button" id="%q.id%btnLineWidth = 5" title="Dicke Linie">Dicke Linie</button>
    <button type="button" id="%q.id%btnUndo" title="Rückgängig">Rückgängig</button>
    <button type="button" id="%q.id%btnClear" title="Bild löschen">Nochmal von vorne</button>
    <button type="button" id="%q.id%btnSend">Fertig, Weiter</button>
</div>
<script>
function Scribbler(qID, canvas) {
  var state = "new";  // new, init, changed, sent
  var ctx = canvas.getContext('2d');
  var img = new Image();
  img.src= "pro://Beispielbild-unsplash.jpg"
  img.onload = function () {
    var pattern = ctx.createPattern(img, "no-repeat");
    ctx.fillStyle = pattern;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
   var isDrawing = false;
   var btnClear = document.getElementById("%q.id%btnClear");
   var btnSend = document.getElementById("%q.id%btnSend");
   var btnUndo = document.getElementById("%q.id%btnUndo");
   var steps = [];
};
function getPos(e) {
    var org = SoSciTools.getNodePos(canvas);
    var pos = SoSciTools.getMousePos(e);
    return {
      x : pos.x - org.x,
      y : pos.y - org.y
    };
  }
  function onDown(e) {
    state = "changed";
    storeStep();
    isDrawing = true;
    ctx.beginPath();
    ctx.lineWidth = 2;
    ctx.strokeStyle = 'blue';
    ctx.strokeLine(10, 10, 100, 100);
    ctx.shadowBlur = 0,5;
    ctx.lineJoin = ctx.lineCap = 'round';
    ctx.shadowColor = 'rgb(0, 0, 0)';
    var pos = getPos(e);
    ctx.moveTo(pos.x, pos.y);
    // Draw first dot
    onMove(e);
  }
  function onMove(e) {
    if (!isDrawing) {
      return;
    }
    var pos = getPos(e);
    ctx.lineTo(pos.x, pos.y);
    ctx.stroke();
    return SoSciTools.stopEvent(e);
  };
  function onUp() {
    isDrawing = false;
  };
  function onStop() {
    isDrawing = false;
  }
  function onClear() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  function storeStep() {
    steps.push(canvas.toDataURL());
  }
  function onUndo() {
    // based on https://www.codicode.com/art/undo_and_redo_to_the_html5_canvas.aspx
    if (steps.length === 0) {
      return;
    }
    var recent = steps.pop();
    var canvasPic = new Image();
    canvasPic.addEventListener("load", function () {
      ctx.drawImage(canvasPic, 0, 0);
    });
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    canvasPic.src = recent;
  }
  // Enable all the events
  if (Modernizr && Modernizr.pointerevents) {
    canvas.addEventListener("pointerdown", onDown, false);
    canvas.addEventListener("pointermove", onMove, false);
    canvas.addEventListener("pointerup", onUp, false);
    canvas.addEventListener("pointerout", onStop, false);
  } else {
    SoSciTools.attachEvent(canvas, ["mousedown", "touchstart"], onDown);
    SoSciTools.attachEvent(canvas, ["mousemove", "touchmove"], onMove);
    SoSciTools.attachEvent(canvas, ["mouseup", "touchend"], onUp);
    SoSciTools.attachEvent(canvas, ["mouseout", "touchcancel"], onStop);
  }
  if (btnClear) {
    btnClear.addEventListener("click", function() {
      if (confirm("Möchten Sie das Bild löschen?")) {
        onClear();
      }
    });
  }
  if (btnUndo) {
    btnUndo.addEventListener("click", onUndo);
  }
  
  // File transfer part
  function sendImage() {
    var imageBlob = canvas.toBlob(%q.id%.sendBLOB);
    state = "sent";
    return true;
  }
  // Function to be called when the blob is to be send
  function blobGetter(blobHandler) {
    // Only send something when changed since init or sent
    if (state !== "changed") {
      return false;
    }
    canvas.toBlob(blobHandler);
    state = "sent";
    return true;
  }
  // Use custom send button
  if (btnSend) {
    // Use custom submit button
    btnSend.addEventListener("click", sendImage);
    // Hide original button
    SoSciTools.submitButtonsHide();
  }
  // Alway send on form submission
  window.addEventListener("load", function() {
    %q.id%.registerOnSubmit(blobGetter);
  });
}
new Scribbler("%q.id%", document.getElementById("%q.id%canvas"));
</script>
Dort wo Sie im Code ctx.lineWidth = 2; finden, können Sie auch eine Farbe für den Strich definieren, vgl. https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle
Danke, das hat geklappt.
Ja, aber Sie werden dafür ein wenig JavaScript basteln müssen. Im Prinzip müssen Sie nur per Knopfdruck in einer Variable die gewünschte Strichstärke ablegen - und beim ctx.lineWidth = 2; ersetzen Sie die 2 dann durch die Variable mit der Strichstärke.
Das Erstellen der Knöpfe hat funktioniert. Nun weiß ich allerdings nicht, wie ich die verschiedenen Strichstärken mit dem entsprechenden Knopfdruck verknüpfen kann (siehe Code oben).