# Anki-Karten mit Bildverdeckung erzeugen

Canonical page: https://ankiforge.dev/de/docs/image-occlusion/
Language: de
Description: Erzeuge Bildverdeckungskarten per Code mit Rust, Python oder Node.js: Gib Bild und Rechteckmasken vor und wähle einen der beiden Verdeckungsmodi.

Erzeuge Anki-Karten mit Bildverdeckung per Code: Du lieferst ein Bild und Rechteckkoordinaten, und Anki Forge erstellt eine importfertige Notiz mit einer Karte pro Maske. So kannst du Diagrammfragen stapelweise erzeugen, ohne Masken in Ankis Editor zu zeichnen. Die Bibliothek erkennt keine Beschriftungen im Bild; die Koordinaten gibst du vor.

Erstelle eine strukturierte Notiz zur Bildverdeckung aus einem Bild mit eigenem Datenbesitz und Rechtecken. Jede Maske benötigt einen stabilen Schlüssel, der auch in späteren Versionen denselben Bereich bezeichnet. Die Notiz wird wie gewöhnlich mit `add(key, note)` einem Projekt hinzugefügt. Diese Beispiele verwenden Rust; Python und Node.js bieten denselben Builder in der [Python-API](https://ankiforge.dev/de/docs/python-api/#media-and-occlusion) und [Node-API](https://ankiforge.dev/de/docs/node-api/#media-and-image-occlusion).

## Das Beispiel ausführen

```sh
cargo run --locked -p ankiforge --example docs_workflow -- target/docs-examples
```

Öffne `target/docs-examples/diagram.apkg` in Anki. Das vollständige Programm lädt das Bild für die Bildverdeckung aus dem Repository und prüft eine Notiz, eine Karte und eine Mediendatei.

```rust
fn occlusion(output: &Path, diagram: &Path) -> anyhow::Result<()> {
    let image = Media::file(diagram)?;
    let note = Note::image_occlusion(image)
        .mask(Mask::rect("region-1", 10, 10, 40, 25))
        .build()?;
    let mut project = Project::new("docs-diagram")?.default_deck("Diagram");
    project.add("diagram", note)?;
    let built = project.build(BuildOptions::to(output.join("diagram.apkg")))?;
    verify(&built, 1, 1, 1)?;
    Ok(())
}
```

## Mehrere Masken und Modi

Dieses eigenständige Beispiel erwartet `fixtures/occlusion.png`, ein dekodiertes Bild mit mindestens 80 × 80 Pixeln:

```rust
use ankiforge::{BuildOptions, Media, Note, Project};
use ankiforge::note::{Mask, OcclusionMode};

fn main() -> anyhow::Result<()> {
    let note = Note::image_occlusion(Media::file("fixtures/occlusion.png")?)
        .mask(Mask::rect("nucleus", 10, 10, 20, 20))
        .mask(Mask::rect("wall", 50, 50, 20, 20))
        .mode(OcclusionMode::HideOneGuessOne)
        .build()?
        .field("header", "Cell structure")
        .field("back_extra", "Review the diagram.");
    let mut project = Project::new("cell-diagram")?;
    project.add("cell", note)?;
    let output = project.build(BuildOptions::to("cell-diagram.apkg"))?;
    assert_eq!(output.report().counts().cards, 2);
    Ok(())
}
```

`HideAllGuessOne` ist die Standardeinstellung; `HideOneGuessOne` wird ebenfalls unterstützt. Jede Maske mit Schlüssel erzeugt ihre eigene Cloze-Karte. Koordinaten sind endliche Pixelwerte im angezeigten Bild nach Anwendung der EXIF-Ausrichtung. Die Bibliothek dekodiert PNG, JPEG, GIF, WebP und BMP vollständig. Das Budget des dekodierten Puffers beträgt 256 MiB und ist vom Importbudget für komprimierte Medien unabhängig. Rechtecke müssen positive Abmessungen haben, innerhalb des Bildes liegen und eindeutige, nicht leere Schlüssel verwenden.

Der Builder validiert Bild und Masken, bevor er eine `Note` zurückgibt. Verwende gewöhnliche `field`\-Zuweisungen für `header`, `back_extra` und `comments`; die erzeugten Felder `image` und `occlusion` sind reserviert und dürfen nicht überschrieben werden.

Bei Aktualisierungen auf Basis einer früheren Verteilung erhalten Maskenschlüssel die Kartennummern auch bei geänderter Reihenfolge. Entfernte Masken reservieren ihre Nummern; wird derselbe Schlüssel wiederhergestellt, wird seine Nummer erneut verwendet. Neue Schlüssel übernehmen nie die Identität einer anderen Maske. Der unterstützte Nummernbereich ist 1–500; ist er ausgeschöpft, schlägt der Vorgang ausdrücklich fehl. Entfernte oder hinzugefügte Masken erscheinen in der [Risikoanalyse für Aktualisierungen](https://ankiforge.dev/de/docs/updates/). Das Weglassen einer Karte im APKG löscht die vorhandene Karte eines Lernenden nicht.
