{"id":7507,"date":"2025-04-24T04:27:05","date_gmt":"2025-04-24T04:27:05","guid":{"rendered":"https:\/\/textsnapper.com\/?page_id=7507"},"modified":"2025-06-03T08:59:00","modified_gmt":"2025-06-03T08:59:00","slug":"readinghelp","status":"publish","type":"page","link":"https:\/\/textsnapper.com\/en\/readinghelp\/","title":{"rendered":"readinghelp"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"7507\" class=\"elementor elementor-7507\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4a6c6d3 e-flex e-con-boxed e-con e-parent\" data-id=\"4a6c6d3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5300ca8 elementor-widget elementor-widget-heading\" data-id=\"5300ca8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/textsnapper.com\/en\/\">Enlarge text<\/a><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5aa8c41 elementor-widget elementor-widget-html\" data-id=\"5aa8c41\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- OCR Text Vergr\u00f6\u00dferungs-Widget -->\n<div id=\"ocr-zoom-widget\" style=\"max-width:800px;margin:auto;padding:20px;border:1px solid #ddd;border-radius:8px;background:#fafafa;text-align:center;\">\n  <button id=\"start-camera\" class=\"btn\">\ud83d\udcf7 Start camera<\/button>\n  <button id=\"upload-image\" class=\"btn\">\ud83d\udcc1 Upload image<\/button>\n  <input type=\"file\" id=\"image-upload\" accept=\"image\/*\" style=\"display:none\">\n\n  <div id=\"loading\" style=\"display:none;margin-top:20px;font-size:18px;color:#2F5591;\"><\/div>\n\n  <div id=\"image-container\" style=\"position:relative;margin-top:20px;\"><\/div>\n\n  <div id=\"text-overlay\" style=\"display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);justify-content:center;align-items:center;z-index:9999;\">\n    <div style=\"background:#fff;padding:20px;border-radius:8px;max-width:90%;max-height:90%;overflow:auto;text-align:center;position:relative;\">\n      <button id=\"close-overlay\" class=\"btn\" style=\"position:absolute;top:10px;left:10px;\">Close<\/button>\n      <div id=\"overlay-text\" style=\"font-size:2em;line-height:1.4;margin-top:40px;\"><\/div>\n      <div style=\"margin-top:30px;display:flex;justify-content:center;align-items:center;gap:15px;\">\n        <span id=\"font-size-label\" style=\"font-size:1.2em;\"><\/span>\n        <button id=\"zoom-out\" class=\"btn\" style=\"padding:15px 25px;font-size:1.5em;\">-<\/button>\n        <button id=\"zoom-in\" class=\"btn\" style=\"padding:15px 25px;font-size:1.5em;\">+<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n  .btn {\n    background:#2F5591;color:#fff;padding:10px 15px;border:none;border-radius:4px;cursor:pointer;margin:5px;\n  }\n  .ocr-box {\n    position:absolute;border:2px solid rgba(255,0,0,0.7);background:rgba(255,255,0,0.3);cursor:pointer;\n  }\n<\/style>\n\n<script>\nconst ajaxurl = \"https:\/\/textsnapper.com\/wp-admin\/admin-ajax.php\";\nconst imageUpload = document.getElementById('image-upload');\nconst imageContainer = document.getElementById('image-container');\nconst overlay = document.getElementById('text-overlay');\nconst overlayText = document.getElementById('overlay-text');\nconst loadingIndicator = document.getElementById('loading');\n\/\/ Automatische Spracherkennung (DE\/EN) f\u00fcr Ladeanzeige\nconst lang = document.documentElement.lang.startsWith('en') ? 'en' : 'de';\nloadingIndicator.textContent = lang === 'en' ? '\u23f3 Loading image...' : '\u23f3 Bild wird geladen...';\n\/\/ Automatische \u00dcbersetzung des Schriftgr\u00f6\u00dfe-Labels\nconst fontSizeLabel = document.getElementById('font-size-label');\nfontSizeLabel.textContent = lang === 'en' ? 'Change font size:' : 'Schriftgr\u00f6\u00dfe \u00e4ndern:';\n\n\nconst startCamera = document.getElementById('start-camera');\nconst uploadImage = document.getElementById('upload-image');\nconst closeOverlay = document.getElementById('close-overlay');\nconst zoomInBtn = document.getElementById('zoom-in');\nconst zoomOutBtn = document.getElementById('zoom-out');\n\nlet currentFontSize = 2;\n\nstartCamera.onclick = () => {\n  imageUpload.setAttribute(\"capture\", \"environment\");\n  imageUpload.click();\n};\n\nuploadImage.onclick = () => {\n  imageUpload.removeAttribute(\"capture\");\n  imageUpload.click();\n};\n\nimageUpload.onchange = () => {\n  const file = imageUpload.files[0];\n  if (!file) return;\n\n  loadingIndicator.style.display = 'block';\n  imageContainer.innerHTML = '';\n\n  const reader = new FileReader();\n  reader.onload = e => {\n    renderImageToCanvas(e.target.result, finalBase64 => {\n      processOCR(finalBase64);\n    });\n  };\n  reader.readAsDataURL(file);\n};\n\nfunction renderImageToCanvas(base64, callback) {\n  const img = new Image();\n  img.onload = function () {\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = img.width;\n    canvas.height = img.height;\n    const ctx = canvas.getContext(\"2d\");\n    ctx.drawImage(img, 0, 0);\n    const finalImage = canvas.toDataURL(\"image\/jpeg\", 0.95);\n    callback(finalImage);\n  };\n  img.src = base64;\n}\n\nasync function processOCR(base64img) {\n  const formData = new URLSearchParams({ action: 'process_ocr', image_data: base64img });\n  const res = await fetch(ajaxurl, {\n    method: 'POST',\n    headers: { \"Content-Type\": \"application\/x-www-form-urlencoded\" },\n    body: formData\n  });\n\n  const json = await res.json();\n  if (json.success) {\n    const rotationDegrees = detectCorrectRotation(json.data.boxes);\n    rotateImageWithBoxes(base64img, json.data.boxes, rotationDegrees, ({ rotatedImage, rotatedBoxes }) => {\n      displayOCRBoxes(rotatedImage, rotatedBoxes);\n      loadingIndicator.style.display = 'none';\n      document.dispatchEvent(new Event('ocrUsageUpdated'));\n    });\n  } else {\n    loadingIndicator.style.display = 'none';\n    alert(\"Fehler bei der Texterkennung.\");\n  }\n}\n\nfunction displayOCRBoxes(imgSrc, boxes) {\n  const container = document.createElement('div');\n  container.className = 'ocr-image-container';\n  container.style.position = 'relative';\n  container.style.display = 'inline-block';\n  container.style.textAlign = 'center';\n  container.style.maxWidth = '100%';\n\n  const img = document.createElement('img');\n  img.src = imgSrc;\n  img.style.maxWidth = '100%';\n  img.style.height = 'auto';\n  container.appendChild(img);\n\n  imageContainer.innerHTML = '';\n  imageContainer.style.textAlign = 'center'; \/\/ Zentrierung im Container\n  imageContainer.appendChild(container);\n\n  img.onload = () => {\n    const rect = img.getBoundingClientRect();\n    const scaleX = rect.width \/ img.naturalWidth;\n    const scaleY = rect.height \/ img.naturalHeight;\n\n    \/\/ L\u00f6sche zuerst bestehende OCR-Boxen\n    container.querySelectorAll('.ocr-box').forEach(el => el.remove());\n\n    boxes.forEach(box => {\n      const vertices = box.vertices;\n      const minX = Math.min(...vertices.map(v => v.x));\n      const minY = Math.min(...vertices.map(v => v.y));\n      const maxX = Math.max(...vertices.map(v => v.x));\n      const maxY = Math.max(...vertices.map(v => v.y));\n\n      const boxDiv = document.createElement('div');\n      boxDiv.className = 'ocr-box';\n\n      boxDiv.style.left = `${minX * scaleX}px`;\n      boxDiv.style.top = `${minY * scaleY}px`;\n      boxDiv.style.width = `${(maxX - minX) * scaleX}px`;\n      boxDiv.style.height = `${(maxY - minY) * scaleY}px`;\n\n      boxDiv.onclick = () => showOverlay(box.text);\n\n      container.appendChild(boxDiv);\n    });\n  };\n}\n\nfunction showOverlay(text) {\n  currentFontSize = 2;\n  overlayText.style.fontSize = `${currentFontSize}em`;\n  overlayText.textContent = text;\n  overlay.style.display = 'flex';\n}\n\ncloseOverlay.onclick = () => {\n  overlay.style.display = 'none';\n};\n\nzoomInBtn.onclick = () => {\n  if (currentFontSize < 5) {\n    currentFontSize += 0.2;\n    overlayText.style.fontSize = `${currentFontSize}em`;\n  }\n};\n\nzoomOutBtn.onclick = () => {\n  if (currentFontSize > 1) {\n    currentFontSize -= 0.2;\n    overlayText.style.fontSize = `${currentFontSize}em`;\n  }\n};\n\n\/\/ Ermittelt die notwendige Rotationsrichtung anhand der OCR-Daten\nfunction detectCorrectRotation(boxes) {\n  if (!boxes || boxes.length === 0) return 0;\n\n  const vertices = boxes[0].vertices;\n  const dx = vertices[1].x - vertices[0].x;\n  const dy = vertices[1].y - vertices[0].y;\n\n  const angleRadians = Math.atan2(dy, dx);\n  const angleDegrees = angleRadians * (180 \/ Math.PI);\n  const normalizedAngle = (angleDegrees + 360) % 360;\n\n  if (normalizedAngle > 75 && normalizedAngle < 105) return 90;\n  if (normalizedAngle > 165 && normalizedAngle < 195) return 180;\n  if (normalizedAngle > 255 && normalizedAngle < 285) return 270;\n\n  return 0;\n}\n\n\/\/ Rotiert OCR-Boxen um die korrekte Gradzahl\nfunction rotateBoundingBoxes(boxes, imgWidth, imgHeight, rotationDegrees) {\n  let newWidth = imgWidth, newHeight = imgHeight;\n\n  if (rotationDegrees === 90 || rotationDegrees === 270) {\n    newWidth = imgHeight;\n    newHeight = imgWidth;\n  }\n\n  return boxes.map(box => {\n    const rotatedVertices = box.vertices.map(v => {\n      switch(rotationDegrees) {\n        case 90: return { x: v.y, y: imgWidth - v.x };\n        case 180: return { x: imgWidth - v.x, y: imgHeight - v.y };\n        case 270: return { x: imgHeight - v.y, y: v.x };\n        default: return { x: v.x, y: v.y };\n      }\n    });\n    return { ...box, vertices: rotatedVertices };\n  });\n}\n\n\n\/\/ Rotiert Bild und OCR-Boxen gleichzeitig\nfunction rotateImageWithBoxes(imageSrc, boxes, rotationDegrees, callback) {\n  const img = new Image();\n  img.onload = function () {\n    const canvas = document.createElement(\"canvas\");\n    const ctx = canvas.getContext(\"2d\");\n\n    const width = img.width;\n    const height = img.height;\n\n    if (rotationDegrees === 90 || rotationDegrees === 270) {\n      canvas.width = height;\n      canvas.height = width;\n    } else {\n      canvas.width = width;\n      canvas.height = height;\n    }\n\n    ctx.translate(canvas.width \/ 2, canvas.height \/ 2);\n    ctx.rotate(-rotationDegrees * Math.PI \/ 180);\n    ctx.drawImage(img, -width \/ 2, -height \/ 2);\n\n    const rotatedImage = canvas.toDataURL(\"image\/jpeg\", 0.9);\n    const rotatedBoxes = rotateBoundingBoxes(boxes, width, height, rotationDegrees);\n\n    if (typeof callback === \"function\") {\n      callback({ rotatedImage, rotatedBoxes });\n    }\n  };\n  img.src = imageSrc;\n}\n\nasync function checkOCRLimitForZoomWidget() {\n  const response = await fetch('https:\/\/textsnapper.com\/wp-admin\/admin-ajax.php', {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application\/x-www-form-urlencoded\" },\n    credentials: \"include\",\n    body: new URLSearchParams({ action: \"get_user_ocr_count\" })\n  });\n  const result = await response.json();\n\n  if (result.success) {\n    const { used_ocr, ocr_limit } = result.data;\n\n    if (ocr_limit !== -1 && used_ocr >= ocr_limit) {\n      \/\/ Buttons deaktivieren\n      document.getElementById('start-camera').disabled = true;\n      document.getElementById('upload-image').disabled = true;\n\n      \/\/ Buttons optisch deaktivieren\n      document.getElementById('start-camera').style.background = '#ccc';\n      document.getElementById('upload-image').style.background = '#ccc';\n      document.getElementById('start-camera').style.cursor = 'not-allowed';\n      document.getElementById('upload-image').style.cursor = 'not-allowed';\n\n      \/\/ Hinweis hinzuf\u00fcgen\n      const upgradeNotice = document.createElement('div');\n      upgradeNotice.style.color = '#b00000';\n      upgradeNotice.style.fontWeight = 'bold';\n      upgradeNotice.style.marginTop = '15px';\n      upgradeNotice.textContent = '\u26a0\ufe0f Keine Uploads mehr m\u00f6glich. Bitte Upgrade durchf\u00fchren.';\n\n      document.getElementById('ocr-zoom-widget').prepend(upgradeNotice);\n    }\n  } else {\n    console.error('Fehler bei OCR-Limitabfrage:', result.data);\n  }\n}\n\n\/\/ Nach dem DOM-Laden OCR-Limit pr\u00fcfen\ndocument.addEventListener('DOMContentLoaded', checkOCRLimitForZoomWidget);\n\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-118fe58 elementor-widget elementor-widget-text-editor\" data-id=\"118fe58\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Start with <strong data-start=\"334\" data-end=\"354\">\"Start camera\"<\/strong>, take a photo of the desired text and confirm by clicking <strong data-start=\"408\" data-end=\"416\">\u201eOk\u201c<\/strong>.<br data-start=\"417\" data-end=\"420\" \/>Then click on a red highlighted text box to enlarge the selected section.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-38e34ab elementor-widget elementor-widget-html\" data-id=\"38e34ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"credit-count-notice-widget\" style=\"text-align:center; margin-top:20px;\">\n  <span id=\"credits-left-notice\">Lade Credits...<\/span>\n  <br>\n  <span id=\"ocr-left-notice\" style=\"display:none;\">Lade OCR-Limits...<\/span>\n  <div id=\"upgrade-button-container\" style=\"display:none;\">\n    <a href=\"https:\/\/textsnapper.com\/en\/pricing\/\" class=\"upgrade-btn\">upgrade now<\/a>\n  <\/div>\n<\/div>\n\n<style>\n  #credits-left-notice, #ocr-left-notice {\n    font-family: 'Atkinson Hyperlegible', Arial, sans-serif;\n    font-size: 16px;\n    color: #555;\n  }\n\n  .warning {\n    color: #f44336;\n    font-weight: bold;\n  }\n\n  .unlimited {\n    color: #4CAF50;\n    font-weight: bold;\n  }\n\n  .upgrade-btn {\n    display: inline-block;\n    padding: 10px 20px;\n    background: #2F5591;\n    color: #FFFFFF;\n    font-weight: bold;\n    border: none;\n    border-radius: 4px;\n    text-decoration: none;\n    cursor: pointer;\n    transition: background 0.3s, transform 0.2s ease;\n    margin-top: 10px;\n  }\n\n  .upgrade-btn:hover {\n    background: #24467a;\n    transform: translateY(-2px);\n  }\n<\/style>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', async function () {\n  const lang = document.documentElement.lang.startsWith('en') ? 'en' : 'de';\n  const noticeEl = document.getElementById('credits-left-notice');\n  const ocrEl = document.getElementById('ocr-left-notice');\n  const upgradeBtnContainer = document.getElementById('upgrade-button-container');\n\n  const translations = {\n    de: {\n      loading: 'Lade Credits...',\n      base_monthly: 'Monatliche Credits verf\u00fcgbar',\n      base_package: 'Paket-Credits verf\u00fcgbar (g\u00fcltig bis',\n      unlimited: 'Verf\u00fcgbare uploads: unbegrenzt \u2714\ufe0f',\n      warning: '\u26a0\ufe0f Limit fast erreicht!',\n      error: 'Fehler beim Laden.',\n      no_credits: 'Keine Credits verf\u00fcgbar.',\n      upgrade_now: 'Jetzt upgraden',\n      ocr_loading: 'Lade OCR-Limits...',\n      ocr_available: 'OCR-Uploads verf\u00fcgbar diesen Monat',\n      ocr_no_available: 'Keine OCR-Uploads mehr verf\u00fcgbar.'\n    },\n    en: {\n      loading: 'Loading credits...',\n      base_monthly: 'Monthly credits available',\n      base_package: 'Package credits available (valid until',\n      unlimited: 'Available uploads: unlimited \u2714\ufe0f',\n      warning: '\u26a0\ufe0f Limit almost reached!',\n      error: 'Error loading.',\n      no_credits: 'No credits available.',\n      upgrade_now: 'Upgrade now',\n      ocr_loading: 'Loading OCR limits...',\n      ocr_available: 'OCR uploads available this month',\n      ocr_no_available: 'No OCR uploads left.'\n    }\n  };\n\n  function t(key) {\n    return translations[lang][key];\n  }\n\n  async function fetchAjax(action) {\n    const res = await fetch(window.ajaxurl || '\/wp-admin\/admin-ajax.php', {\n      method: 'POST',\n      credentials: 'include',\n      headers: { \"Content-Type\": \"application\/x-www-form-urlencoded\" },\n      body: new URLSearchParams({ action })\n    });\n    return res.json();\n  }\n\n  let showUpgradeButton = false;\n\n  async function updateCreditNotice() {\n    noticeEl.classList.remove('warning', 'unlimited');\n    noticeEl.textContent = t('loading');\n\n    try {\n      const [monthlyRes, packageRes] = await Promise.all([\n        fetchAjax('get_user_credit_count'),\n        fetchAjax('get_user_package_credits')\n      ]);\n\n      if (!monthlyRes.success || !packageRes.success) {\n        noticeEl.textContent = t('error');\n        return;\n      }\n\n      const monthlyLeft = monthlyRes.data.monthly_credits_remaining;\n      const packageLeft = packageRes.data.credits;\n      const packageExpires = packageRes.data.expires;\n\n      let totalCredits = monthlyLeft + packageLeft;\n      let messages = [];\n\n      if (monthlyLeft === -1) {\n        noticeEl.textContent = t('unlimited');\n        noticeEl.classList.add('unlimited');\n        return;\n      }\n\n      messages.push(`${t('base_monthly')}: ${monthlyLeft}`);\n\n      if (packageLeft > 0) {\n        messages.push(`${t('base_package')} ${packageExpires}): ${packageLeft}`);\n      }\n\n      noticeEl.textContent = messages.join(' | ');\n\n      if (totalCredits <= 500) {\n        noticeEl.classList.add('warning');\n        noticeEl.innerHTML += `<br>${t('warning')}`;\n        showUpgradeButton = true;\n      }\n\n      if (totalCredits <= 0) {\n        noticeEl.classList.add('warning');\n        noticeEl.textContent = `${t('no_credits')}`;\n        showUpgradeButton = true;\n      }\n\n      toggleUpgradeButton();\n    } catch (e) {\n      noticeEl.textContent = t('error');\n    }\n  }\n\n  async function updateOCRNotice() {\n    ocrEl.style.display = 'inline';\n    ocrEl.textContent = t('ocr_loading');\n    ocrEl.classList.remove('warning');\n\n    try {\n      const res = await fetchAjax('get_user_ocr_count');\n      if (!res.success) {\n        ocrEl.textContent = t('error');\n        return;\n      }\n\n      const ocrLeft = res.data.ocr_limit - res.data.used_ocr;\n\n      if (res.data.ocr_limit === -1) {\n        ocrEl.textContent = t('unlimited');\n        ocrEl.classList.add('unlimited');\n        return;\n      }\n\n      if (ocrLeft <= 0) {\n        ocrEl.textContent = t('ocr_no_available');\n        ocrEl.classList.add('warning');\n        showUpgradeButton = true;\n      } else {\n        ocrEl.textContent = `${t('ocr_available')}: ${ocrLeft}`;\n        if (ocrLeft <= 1) ocrEl.classList.add('warning');\n      }\n\n      toggleUpgradeButton();\n    } catch (e) {\n      ocrEl.textContent = t('error');\n    }\n  }\n\n  function toggleUpgradeButton() {\n    upgradeBtnContainer.style.display = showUpgradeButton ? 'block' : 'none';\n  }\n\n  updateCreditNotice();\n  updateOCRNotice();\n\n  document.addEventListener('ttsUsageUpdated', updateCreditNotice);\n  document.addEventListener('ocrUsageUpdated', updateOCRNotice);\n});\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Text vergr\u00f6\u00dfern \ud83d\udcf7 Kamera starten \ud83d\udcc1 Bild hochladen Schlie\u00dfen &#8211; + Starte mit \u201eKamera starten\u201c, fotografiere den gew\u00fcnschten Text und best\u00e4tige mit \u201eOk\u201c.Klicke anschlie\u00dfend auf eine rot markierte Textbox, um den jeweiligen Abschnitt zu vergr\u00f6\u00dfern. Lade Credits&#8230; Lade OCR-Limits&#8230; Jetzt upgraden<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/template-pagebuilder-full-width.php","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"class_list":["post-7507","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>readinghelp - TextSnapper<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/textsnapper.com\/en\/readinghelp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"readinghelp - TextSnapper\" \/>\n<meta property=\"og:description\" content=\"Text vergr\u00f6\u00dfern \ud83d\udcf7 Kamera starten \ud83d\udcc1 Bild hochladen Schlie\u00dfen &#8211; + Starte mit \u201eKamera starten\u201c, fotografiere den gew\u00fcnschten Text und best\u00e4tige mit \u201eOk\u201c.Klicke anschlie\u00dfend auf eine rot markierte Textbox, um den jeweiligen Abschnitt zu vergr\u00f6\u00dfern. Lade Credits&#8230; Lade OCR-Limits&#8230; Jetzt upgraden\" \/>\n<meta property=\"og:url\" content=\"https:\/\/textsnapper.com\/en\/readinghelp\/\" \/>\n<meta property=\"og:site_name\" content=\"TextSnapper\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-03T08:59:00+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/textsnapper.com\\\/readinghelp\\\/\",\"url\":\"https:\\\/\\\/textsnapper.com\\\/readinghelp\\\/\",\"name\":\"readinghelp - TextSnapper\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/textsnapper.com\\\/#website\"},\"datePublished\":\"2025-04-24T04:27:05+00:00\",\"dateModified\":\"2025-06-03T08:59:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/textsnapper.com\\\/readinghelp\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/textsnapper.com\\\/readinghelp\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/textsnapper.com\\\/readinghelp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/textsnapper.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"readinghelp\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/textsnapper.com\\\/#website\",\"url\":\"https:\\\/\\\/textsnapper.com\\\/\",\"name\":\"TextSnapper\",\"description\":\"Texte aus Bildern vorlesen, \u00fcbersetzen und einfach h\u00f6ren.\",\"publisher\":{\"@id\":\"https:\\\/\\\/textsnapper.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/textsnapper.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/textsnapper.com\\\/#organization\",\"name\":\"Textsnapper\",\"url\":\"https:\\\/\\\/textsnapper.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/textsnapper.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/textsnapper.com\\\/wp-content\\\/uploads\\\/2024\\\/12\\\/cropped-cropped-cropped-textsnapper.png\",\"contentUrl\":\"https:\\\/\\\/textsnapper.com\\\/wp-content\\\/uploads\\\/2024\\\/12\\\/cropped-cropped-cropped-textsnapper.png\",\"width\":200,\"height\":200,\"caption\":\"Textsnapper\"},\"image\":{\"@id\":\"https:\\\/\\\/textsnapper.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"readinghelp - TextSnapper","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/textsnapper.com\/en\/readinghelp\/","og_locale":"en_US","og_type":"article","og_title":"readinghelp - TextSnapper","og_description":"Text vergr\u00f6\u00dfern \ud83d\udcf7 Kamera starten \ud83d\udcc1 Bild hochladen Schlie\u00dfen &#8211; + Starte mit \u201eKamera starten\u201c, fotografiere den gew\u00fcnschten Text und best\u00e4tige mit \u201eOk\u201c.Klicke anschlie\u00dfend auf eine rot markierte Textbox, um den jeweiligen Abschnitt zu vergr\u00f6\u00dfern. Lade Credits&#8230; Lade OCR-Limits&#8230; Jetzt upgraden","og_url":"https:\/\/textsnapper.com\/en\/readinghelp\/","og_site_name":"TextSnapper","article_modified_time":"2025-06-03T08:59:00+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/textsnapper.com\/readinghelp\/","url":"https:\/\/textsnapper.com\/readinghelp\/","name":"readinghelp - TextSnapper","isPartOf":{"@id":"https:\/\/textsnapper.com\/#website"},"datePublished":"2025-04-24T04:27:05+00:00","dateModified":"2025-06-03T08:59:00+00:00","breadcrumb":{"@id":"https:\/\/textsnapper.com\/readinghelp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/textsnapper.com\/readinghelp\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/textsnapper.com\/readinghelp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/textsnapper.com\/"},{"@type":"ListItem","position":2,"name":"readinghelp"}]},{"@type":"WebSite","@id":"https:\/\/textsnapper.com\/#website","url":"https:\/\/textsnapper.com\/","name":"TextSnapper","description":"Texte aus Bildern vorlesen, \u00fcbersetzen und einfach h\u00f6ren.","publisher":{"@id":"https:\/\/textsnapper.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/textsnapper.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/textsnapper.com\/#organization","name":"Textsnapper","url":"https:\/\/textsnapper.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/textsnapper.com\/#\/schema\/logo\/image\/","url":"https:\/\/textsnapper.com\/wp-content\/uploads\/2024\/12\/cropped-cropped-cropped-textsnapper.png","contentUrl":"https:\/\/textsnapper.com\/wp-content\/uploads\/2024\/12\/cropped-cropped-cropped-textsnapper.png","width":200,"height":200,"caption":"Textsnapper"},"image":{"@id":"https:\/\/textsnapper.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/textsnapper.com\/en\/wp-json\/wp\/v2\/pages\/7507","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/textsnapper.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/textsnapper.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/textsnapper.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/textsnapper.com\/en\/wp-json\/wp\/v2\/comments?post=7507"}],"version-history":[{"count":134,"href":"https:\/\/textsnapper.com\/en\/wp-json\/wp\/v2\/pages\/7507\/revisions"}],"predecessor-version":[{"id":10306,"href":"https:\/\/textsnapper.com\/en\/wp-json\/wp\/v2\/pages\/7507\/revisions\/10306"}],"wp:attachment":[{"href":"https:\/\/textsnapper.com\/en\/wp-json\/wp\/v2\/media?parent=7507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}