{"id":5487,"date":"2025-12-28T10:59:36","date_gmt":"2025-12-28T01:59:36","guid":{"rendered":"https:\/\/tomato-made.com\/study\/?p=5487"},"modified":"2026-08-08T17:57:06","modified_gmt":"2026-08-08T08:57:06","slug":"t23","status":"publish","type":"post","link":"https:\/\/tomato-made.com\/study\/market-z\/t23","title":{"rendered":"\u753b\u50cf\u30b5\u30a4\u30ba\u5909\u66f4\u30c4\u30fc\u30eb\uff5c\u30b9\u30de\u30db\u30fb\u30d1\u30bd\u30b3\u30f3\u5bfe\u5fdc\uff0f\u4e00\u62ec\u30ea\u30b5\u30a4\u30ba\u7121\u6599"},"content":{"rendered":"\n<style>\n \n\/* \u25bc \u30d1\u30f3\u304f\u305a\u30ea\u30b9\u30c8\u975e\u8868\u793a *\/\n  .breadcrumb {\n    display: none !important;\n  }\n\n\n\/* \u25bc \u8a18\u4e8b\u30bf\u30a4\u30c8\u30eb\u30fb\u30d1\u30f3\u304f\u305a\u30fb\u30e1\u30bf\u60c5\u5831\u306a\u3069\u306e\u30de\u30fc\u30b8\u30f3\/\u30d1\u30c7\u30a3\u30f3\u30b0\u3092\u9664\u53bb *\/\n.article-header.entry-header,\n.entry-meta,\n.entry-meta.vcard,\n.post-thumbnail {\n  margin-top: 0 !important;\n  padding-top: 0 !important;\n}\n\n\/* \u25bc \u30a2\u30a4\u30ad\u30e3\u30c3\u30c1\u753b\u50cf\u306e\u56f2\u307f\uff08<p class=\"post-thumbnail\">\uff09\u306b\u9699\u9593\u304c\u3042\u308b\u5834\u5408\u306b\u5099\u3048\u3066 *\/\n.post-thumbnail {\n  margin-top: 0 !important;\n  padding-top: 0 !important;\n}\n\n\n  \/* \u25bc \u6295\u7a3f\u65e5\u6642\u30fb\u30e1\u30bf\u60c5\u5831\u3092\u975e\u8868\u793a *\/\n  .post-meta,\n  .post-date,\n  .entry-meta,\n  .published {\n    display: none !important;\n  }\n\n\/* \u25bc \u30a2\u30a4\u30ad\u30e3\u30c3\u30c1\u753b\u50cf\u306e\u56f2\u307f\uff08<p class=\"post-thumbnail\">\uff09\u306b\u9699\u9593\u304c\u3042\u308b\u5834\u5408\u306b\u5099\u3048\u3066 *\/\n.post-thumbnail {\n  margin-top: 0 !important;\n  padding-top: 0 !important;\n}\n\n  \/* \u25bc \u8a18\u4e8b\u30bf\u30a4\u30c8\u30eb\u975e\u8868\u793a\uff08\u5fc5\u8981\u306b\u5fdc\u3058\u3066\uff09 *\/\n  .entry-title {\n    display: none !important;\n  }\n\/* \u25bc \u6295\u7a3f\u8a18\u4e8b\u306e\u30d8\u30c3\u30c0\u30fc\u30a2\u30a4\u30ad\u30e3\u30c3\u30c1\u3092\u975e\u8868\u793a *\/\n.single .post-thumbnail {\n  display: none !important;\n}\n\n\n<\/style>\n\n\n<p><\/p><div id=\"tmResizeTool_final2\">\n<style>\n#tmResizeTool_final2{\n  font-family:\"Segoe UI\",\"Hiragino Kaku Gothic ProN\",Meiryo,sans-serif;\n  background:#fff5f7;\n  color:#5a2b34;\n  padding:16px;\n  border-radius:16px;\n}\n#tmResizeTool_final2 h1{\n  text-align:center;\n  font-size:22px;\n  margin:0 0 16px;\n  color:#e56b8c;\n}\n.tm-box{\n  background:#fff;\n  border-radius:14px;\n  padding:14px;\n  margin-top:14px;\n  border:1px solid rgba(229,107,140,.35);\n}\n.tm-step{\n  font-weight:700;\n  color:#e56b8c;\n  margin-bottom:8px;\n}\n.tm-row{\n  display:flex;\n  gap:14px;\n  flex-wrap:wrap;\n  align-items:center;\n}\n.tm-btn{\n  background:#e56b8c;\n  color:#fff;\n  border:none;\n  padding:8px 20px;\n  border-radius:999px;\n  cursor:pointer;\n  font-weight:700;\n}\n.tm-btn:disabled{opacity:.5;cursor:not-allowed;}\n.tm-row input{\n  padding:6px 8px;\n  border-radius:10px;\n  border:1px solid #f1c6d2;\n  font-size:14px;\n}\n.tm-row select{\n  padding:6px 44px 6px 12px;\n  border-radius:10px;\n  border:1px solid #f1c6d2;\n  font-size:14px;\n  appearance:none;\n  background:\n    #fff\n    url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 20 20'%3E%3Cpath d='M5 7l5 6 5-6z' fill='%23e56b8c'\/%3E%3C\/svg%3E\")\n    no-repeat right 14px center \/ 12px;\n}\n.tm-range{width:220px;max-width:100%;}\n.tm-note{font-size:12px;color:#8a4a57;opacity:.95;}\n#tm-preview{\n  display:grid;\n  grid-template-columns:repeat(auto-fill,minmax(140px,1fr));\n  gap:12px;\n}\n.tm-thumb{\n  padding:6px;\n  background-image:\n    linear-gradient(45deg, #eee 25%, transparent 25%),\n    linear-gradient(-45deg, #eee 25%, transparent 25%),\n    linear-gradient(45deg, transparent 75%, #eee 75%),\n    linear-gradient(-45deg, transparent 75%, #eee 75%);\n  background-size:18px 18px;\n  background-position:0 0,0 9px,9px -9px,-9px 0px;\n}\n.tm-thumb img{\n  width:100%;\n  border-radius:0;\n  cursor:pointer;\n  box-shadow:0 4px 10px rgba(0,0,0,.08);\n  display:block;\n  background:transparent;\n}\n#tm-lightbox{\n  position:fixed;\n  inset:0;\n  background:rgba(0,0,0,.85);\n  display:none;\n  z-index:9999;\n}\n#tm-lightbox-inner{\n  position:relative;\n  max-width:92vw;\n  max-height:92vh;\n  margin:auto;\n}\n#tm-lightbox-inner img{\n  max-width:100%;\n  max-height:100%;\n  display:block;\n  border-radius:0;\n}\n#tm-close{\n  position:absolute;\n  top:-12px;\n  right:-12px;\n  background:#e56b8c;\n  color:#fff;\n  width:32px;\n  height:32px;\n  border-radius:50%;\n  line-height:32px;\n  text-align:center;\n  font-size:20px;\n  font-weight:700;\n  cursor:pointer;\n}\n<\/style>\n\n<h1 id=\"i-0\">\u753b\u50cf\u30ea\u30b5\u30a4\u30ba\u30c4\u30fc\u30eb<\/h1>\n\n<div class=\"tm-box\">\n  <div class=\"tm-step\">\u2460 \u753b\u50cf\u3092\u9078\u629e\uff08\u8907\u6570\u53ef\uff09<\/div>\n  <button class=\"tm-btn\" id=\"tm-pick\" type=\"button\">\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u3076<\/button>\n  <input type=\"file\" id=\"tm-file\" accept=\"image\/*\" multiple style=\"display:none\">\n<\/div>\n\n<div class=\"tm-box\">\n  <div class=\"tm-step\">\u2461 \u30b5\u30a4\u30ba\u30fb\u89d2\u4e38\u30fb\u4fdd\u5b58\u5f62\u5f0f<\/div>\n  <div class=\"tm-row\">\n    <label>\u6700\u5927\u6a2a\u5e45(px)\n      <input type=\"number\" id=\"tm-width\" value=\"1200\" min=\"1\">\n    <\/label>\n\n    <label>\u89d2\u4e38(px)\n      <input type=\"range\" id=\"tm-radius\" class=\"tm-range\" min=\"0\" max=\"200\" value=\"0\">\n      <span id=\"tm-radius-val\">0<\/span>px\n    <\/label>\n\n    <label>\u4fdd\u5b58\u5f62\u5f0f\n      <select id=\"tm-format\">\n        <option value=\"original\">\u5143\u306e\u5f62\u5f0f\u306e\u307e\u307e<\/option>\n        <option value=\"image\/jpeg\">JPEG<\/option>\n        <option value=\"image\/png\" selected>PNG<\/option>\n        <option value=\"image\/webp\">WEBP<\/option>\n        <option value=\"application\/pdf\">PDF<\/option>\n      <\/select>\n    <\/label>\n  <\/div>\n  <div class=\"tm-note\">\n    \u203b\u89d2\u4e38\u306f PNG \/ WEBP \u306e\u3068\u304d\u306e\u307f\u900f\u660e\u3067\u53cd\u6620\u3055\u308c\u307e\u3059\u3002PDF\u306f\u767d\u80cc\u666f\u3067\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002\n  <\/div>\n<\/div>\n\n<div class=\"tm-box\">\n  <div class=\"tm-step\">\u2462 \u30ea\u30b5\u30a4\u30ba\u5f8c\u30d7\u30ec\u30d3\u30e5\u30fc\uff08\u30bf\u30c3\u30d7\u3067\u62e1\u5927\uff09<\/div>\n  <div id=\"tm-preview\"><\/div>\n<\/div>\n\n<div class=\"tm-box\" style=\"text-align:center\">\n  <button class=\"tm-btn\" id=\"tm-save\" type=\"button\" disabled>\u3053\u306e\u5185\u5bb9\u3067\u4e00\u62ec\u4fdd\u5b58<\/button>\n<\/div>\n\n<div id=\"tm-lightbox\">\n  <div id=\"tm-lightbox-inner\">\n    <span id=\"tm-close\">\u00d7<\/span>\n    <img id=\"tm-lightbox-img\" alt=\"\">\n  <\/div>\n<\/div>\n\n<script>\n(() => {\n  const root = document.getElementById('tmResizeTool_final2');\n  if (!root || root.dataset.ready === '1') return;\n  root.dataset.ready = '1';\n\n  const pick = root.querySelector('#tm-pick');\n  const fileInput = root.querySelector('#tm-file');\n  const widthInput = root.querySelector('#tm-width');\n  const radiusInput = root.querySelector('#tm-radius');\n  const radiusVal = root.querySelector('#tm-radius-val');\n  const formatSelect = root.querySelector('#tm-format');\n  const preview = root.querySelector('#tm-preview');\n  const saveBtn = root.querySelector('#tm-save');\n  const lightbox = root.querySelector('#tm-lightbox');\n  const lightImg = root.querySelector('#tm-lightbox-img');\n  const closeBtn = root.querySelector('#tm-close');\n\n  let sources = [];\n  let outputs = [];\n  let renderToken = 0;\n\n  pick.onclick = () => fileInput.click();\n\n  fileInput.onchange = async e => {\n    sources = [];\n    for (const f of e.target.files) {\n      if (!f.type.startsWith('image\/')) continue;\n      const img = new Image();\n      const objectUrl = URL.createObjectURL(f);\n      img.src = objectUrl;\n      try {\n        await img.decode();\n        sources.push({ file: f, w: img.width, h: img.height });\n      } finally {\n        URL.revokeObjectURL(objectUrl);\n      }\n    }\n    render();\n  };\n\n  widthInput.addEventListener('change', render);\n  formatSelect.addEventListener('change', render);\n  radiusInput.addEventListener('input', () => { radiusVal.textContent = radiusInput.value; });\n  radiusInput.addEventListener('change', render);\n\n  function roundedRectPath(ctx, x, y, w, h, r) {\n    const radius = Math.max(0, Math.min(r, w \/ 2, h \/ 2));\n    ctx.beginPath();\n    ctx.moveTo(x + radius, y);\n    ctx.arcTo(x + w, y, x + w, y + h, radius);\n    ctx.arcTo(x + w, y + h, x, y + h, radius);\n    ctx.arcTo(x, y + h, x, y, radius);\n    ctx.arcTo(x, y, x + radius, y, radius);\n    ctx.closePath();\n  }\n\n  function getPreviewMime(srcFileType) {\n    const fmt = formatSelect.value;\n    if (fmt === 'application\/pdf') return 'image\/jpeg';\n    let mime = (fmt === 'original') ? srcFileType : fmt;\n    if (!['image\/jpeg','image\/png','image\/webp'].includes(mime)) mime = 'image\/jpeg';\n    return mime;\n  }\n\n  function getFinalFormat(srcFileType) {\n    const fmt = formatSelect.value;\n    if (fmt === 'application\/pdf') return 'application\/pdf';\n    let mime = (fmt === 'original') ? srcFileType : fmt;\n    if (!['image\/jpeg','image\/png','image\/webp'].includes(mime)) mime = 'image\/jpeg';\n    return mime;\n  }\n\n  async function render() {\n    const token = ++renderToken;\n    outputs.forEach(o => { if (o.url) URL.revokeObjectURL(o.url); });\n    preview.innerHTML = '';\n    outputs = [];\n    saveBtn.disabled = true;\n    if (!sources.length) return;\n\n    const maxW = parseInt(widthInput.value, 10) || 1200;\n    const r = parseInt(radiusInput.value, 10) || 0;\n\n    for (const src of sources) {\n      if (token !== renderToken) return;\n      let w = src.w;\n      let h = src.h;\n      if (w > maxW) {\n        h = Math.round(h * (maxW \/ w));\n        w = maxW;\n      }\n\n      const canvas = document.createElement('canvas');\n      canvas.width = w;\n      canvas.height = h;\n      const ctx = canvas.getContext('2d');\n      const bitmap = await createImageBitmap(src.file);\n      if (token !== renderToken) { bitmap.close?.(); return; }\n\n      const previewMime = getPreviewMime(src.file.type);\n      const finalFormat = getFinalFormat(src.file.type);\n      const transparentRound = (previewMime === 'image\/png' || previewMime === 'image\/webp') && r > 0 && finalFormat !== 'application\/pdf';\n\n      ctx.clearRect(0, 0, w, h);\n      if (finalFormat === 'application\/pdf' || previewMime === 'image\/jpeg') {\n        ctx.fillStyle = '#ffffff';\n        ctx.fillRect(0, 0, w, h);\n      }\n\n      if (transparentRound) {\n        ctx.save();\n        roundedRectPath(ctx, 0, 0, w, h, r);\n        ctx.clip();\n        ctx.drawImage(bitmap, 0, 0, w, h);\n        ctx.restore();\n      } else if (finalFormat === 'application\/pdf' && r > 0) {\n        ctx.save();\n        roundedRectPath(ctx, 0, 0, w, h, r);\n        ctx.clip();\n        ctx.drawImage(bitmap, 0, 0, w, h);\n        ctx.restore();\n      } else {\n        ctx.drawImage(bitmap, 0, 0, w, h);\n      }\n      bitmap.close?.();\n\n      const blob = await new Promise(res => canvas.toBlob(res, previewMime, 0.95));\n      if (token !== renderToken) return;\n      const url = URL.createObjectURL(blob);\n      const baseName = src.file.name.replace(\/\\.[^\/.]+$\/, '');\n\n      outputs.push({ canvas, blob, url, baseName, finalFormat, sourceType: src.file.type });\n\n      const wrap = document.createElement('div');\n      wrap.className = 'tm-thumb';\n      const im = document.createElement('img');\n      im.src = url;\n      im.onclick = () => {\n        lightImg.src = url;\n        lightbox.style.display = 'flex';\n      };\n      wrap.appendChild(im);\n      preview.appendChild(wrap);\n    }\n\n    if (token === renderToken) saveBtn.disabled = false;\n  }\n\n  async function saveAsPdf(o) {\n    if (!window.jspdf || !window.jspdf.jsPDF) {\n      alert('PDF\u6a5f\u80fd\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u30da\u30fc\u30b8\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002');\n      return;\n    }\n    const { jsPDF } = window.jspdf;\n    const w = o.canvas.width;\n    const h = o.canvas.height;\n    const orientation = w >= h ? 'landscape' : 'portrait';\n    const pdf = new jsPDF({ orientation, unit: 'px', format: [w, h], hotfixes: ['px_scaling'] });\n    const dataUrl = o.canvas.toDataURL('image\/jpeg', 0.95);\n    pdf.addImage(dataUrl, 'JPEG', 0, 0, w, h, undefined, 'FAST');\n    pdf.save(`resized_${o.baseName}.pdf`);\n  }\n\n  saveBtn.onclick = async () => {\n    for (const o of outputs) {\n      if (o.finalFormat === 'application\/pdf') {\n        await saveAsPdf(o);\n      } else {\n        const ext = o.finalFormat === 'image\/png' ? 'png'\n                  : o.finalFormat === 'image\/webp' ? 'webp'\n                  : 'jpg';\n        const a = document.createElement('a');\n        a.href = o.url;\n        a.download = `resized_${o.baseName}.${ext}`;\n        document.body.appendChild(a);\n        a.click();\n        a.remove();\n      }\n    }\n  };\n\n  closeBtn.onclick = () => { lightbox.style.display = 'none'; };\n  lightbox.addEventListener('click', e => { if (e.target === lightbox) lightbox.style.display = 'none'; });\n  radiusVal.textContent = radiusInput.value;\n})();\n<\/script>\n<\/div>\n    \n\n\n<p><script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-7399229634306040\" crossorigin=\"anonymous\"><\/script><!-- \u30c7\u30a3\u30b9\u30d7\u30ec\u30a4\u5e83\u544a\u306e\u30d7\u30ec\u30d3\u30e5\u30fc --><ins class=\"adsbygoogle\" style=\"display:block\" data-ad-client=\"ca-pub-7399229634306040\" data-ad-slot=\"1986945645\" data-ad-format=\"auto\" data-full-width-responsive=\"true\"><\/ins><script>     (adsbygoogle = window.adsbygoogle || []).push({});<\/script>\n<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":5515,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,6,8],"tags":[],"class_list":["post-5487","post","type-post","status-publish","format-standard","has-post-thumbnail","category-market-z","category-tool","category-image","entry"],"_links":{"self":[{"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/posts\/5487","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/comments?post=5487"}],"version-history":[{"count":26,"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/posts\/5487\/revisions"}],"predecessor-version":[{"id":12837,"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/posts\/5487\/revisions\/12837"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/media\/5515"}],"wp:attachment":[{"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/media?parent=5487"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/categories?post=5487"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tomato-made.com\/study\/wp-json\/wp\/v2\/tags?post=5487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}