目次

はじめに

本書について

サンプルコード
著者紹介
サークル紹介
免責事項
表記関係について
謝辞

第1章 簡単なSVG画像をつくる

1.1 テキストを扱う
1.2 ビットマップ画像を扱う
1.3 モノクロ化する
1.4 リンクを扱う

第2章 SVG Screenshot開発記

2.1 SVG Screenshotの種
2.2 元祖SVG Screenshot
2.3 PuppeteerでSVG Screenshotを撮る

第3章 高解像度ディスプレイで撮ったスクリーンショットを適切なサイズで表示する

3.1 はじめに
3.2 スクリーンショットをSVG形式で配信する
3.3 DPIを考慮するimg CustomElementをつくる
3.4 Content-DPRヘッダーを付与する
3.5 まとめ

第4章 ScreenshotMLの提案

4.1 SVG ScreenshotをXMLで表現する
4.2 ScreenshotMLのXML Schema
4.3 名前空間を定義する
4.4 XMLを検査する
4.5 XML + XSL → SVG

付録A PNG画像のバイナリから解像度を読み取る

A.1 PNG画像の解像度情報はどこに書かれているか
A.2 解像度を算出する

付録B Blinkでの画像のNaturalSizeの導出過程を追う

B.1 調査ノート

はじめに

 本書は、SVG(Scalable Vector Graphics)とスクリーンショットについて、筆者が趣味で探究してきた内容をまとめたものです。SVGやスクリーンショットに興味がある、ブックマークとしてウェブページをまるごと保存したい、高解像度ディスプレイで撮られたスクリーンショット画像の実寸サイズの取得方法を知りたい方を対象としています。


 本書では、各章は基本的に独立しています。はじめに、本書で扱うSVG画像を読み書きできるようになるための、基礎的な説明をします。続いて、SVGとスクリーンショットを組み合わせた「SVG Screenshot」について、さらに、高解像度ディスプレイで撮ったスクリーンショットのウェブブラウザー上での扱いの工夫を解説します。最後に、「SVG Screenshot」をより発展させ、ウェブページのスクリーンショットをXMLで記述する「ScreenshotML」を提案し、その仕様と実装を示します。また、付録ではJavaScriptでPNG画像のバイナリを読む話、高解像度ディスプレイでのスクリーンショットの問題解決の際に行った、Chromiumのコードリーディングについてまとめています。


 ベクターイラストを作成するために広く普及しているSVGは、どれだけ拡縮して表示しても、ビットマップ画像と異なり、画質が損なわれません。1章では、この便利さを活かしたアイデアを紹介します。また、2章、4章では、技術として成熟している(いわゆる、枯れた技術)XMLやXSLTを利用することで、SVGとスクリーンショットでおもしろいことができるのではないか、という視点で探究しました。さらに3章では、デバイスの高解像度化に伴い直面した、スクリーンショットの表示に関する課題を掘り下げています。今後も高解像度化はより進んでいくと予想されるため、参考になることがあるかもしれません。


 今回探究を進めるなかで、仕様書やその実装、参考実装となる関連する既存のソフトウェアのコードから、数多くの学びを得ました。普段多く触れる二次情報だけでなく、巻末付録で紹介したような一次情報にも、目を向けるきっかけになれば幸いです。日常で自分の使うものを形にして改良していくと、次々とアイデアが湧いてきます。また、興味があることを深掘りするのは、楽しいことです。本書が、読者のそのようなきっかけになると、嬉しい限りです。

本書について

サンプルコード

 紙面の都合上、本書に登場するコード片は、一部省略されていることがあります。ソースコードの全容はhttps://github.com/TheTeamJ/svg-screenshot-bookまたは、記事中で別途示したGitHubリポジトリーにて公開していますので、必要に応じてご参照ください。

著者紹介

 daiiz. 京都生活4年目。関心トピックは、ウェブブラウザーや検索技術・検索UI、画像処理など。仕事では、FAQ検索システムHelpfeel1を作っている。趣味でも、気の赴くままにアプリの開発や要素技術の研究を行っており、これらの成果をまとめた技術同人誌の執筆も手掛けている。夢はSVG芸人。

 Twitter: @daizplus / GitHub: @daiiz

サークル紹介

 TeamJ. 大学時代に、ある講義がきっかけで結成。日頃はScrapbox2上でプログラミングの知見や、創作アイデアの共有を行っている。現在、合同誌の制作を企画中。年に一度は皆で集まり、大きめの旅行をするのが楽しみ。最近の旅の思い出は、伊豆オレンヂセンターで飲んだウルトラ生ジュース。

 GitHub: @TheTeamJ

免責事項

 本書に記載されている内容は、情報の提供のみを目的としています。したがって、本書を参考にした開発や運用に際しては、必ずご自身の責任と判断のもと行ってください。これらの情報による開発や運用の結果について、著者はいかなる責任も負いません。

 本書で紹介している、著者が作成したデモサイトやアプリケーションは、運用費などの事情により予告なく変更、または終了する可能性があります。あらかじめご了承ください。

表記関係について

 本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。

謝辞

 本書の底本を技術系同人誌頒布即売会「第二回 技術書同人誌博覧会」に出展するにあたって、スケジュールの相談をはじめ、原稿のレビュー、居酒屋でのちょっとした会話をもとにして、「はじめに」の書き起こしを行ってくれたサークルメンバーのkanata(@hinanokanata)くんに感謝します。

 本書を商業版として執筆する機会をいただいた、インプレスR&D 山城様に感謝します。また、「さまざまなウェブページの断片的なスクリーンショットが、ネットワーク状に繋がっているイメージ」というぼんやりとした表現でのお願いにもかかわらず、見事な表紙イラストを描いてくださったデザイナーの ひのふ(@pinopo_)様に感謝します。

1. https://helpfeel.com/

2. https://scrapbox.io/product

試し読みはここまでです。
この続きは、製品版でお楽しみください。