RawImages.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// Copyright (c) GrapeCity inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace GcPdfWeb.Samples
{
    // GcPdf で JPEG と JPEG2000 画像を使用します。
    // 
    // 重要:GcPdf 内で画像を複数回描画するとき(例えば、すべてのページのページヘッダの一部として
    // 同じ画像を描画するなど)、すべてのページで同じイメージオブジェクトを使用する場合は、
    // 自動的に辞書に追加され、ドキュメント全体で再利用されます。
    // そのため、必要になるたびにファイル(またはストリーム)から同じ画像を読み込むのではなく、
    // 画像を一度読み込んでイメージオブジェクトにキャッシュすることが常に望ましいです。
    // これは、GcPdf(Image、RawImage)で利用できるすべての画像形式に適用されます。
    public class RawImages
    {
        public void CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            // PDF 形式では、JPEG および JPEG2000 画像を PDF のネイティブ画像形式に変換せずに
            // そのままドキュメントに挿入できます。
            //  GcPdf でこれを行うには、以下のコードが示すように、RawImage クラスを使用できます。
            // 
            // JPEG ファイルから RawImage のインスタンスを作成します。
            using (var image = RawImage.FromFile(Path.Combine("Resources", "Images", "puffins.jpg"), RawImageFormat.Jpeg, 800, 532))
            using (var imageSmall = RawImage.FromFile(Path.Combine("Resources", "ImagesBis", "puffins-small.jpg"), RawImageFormat.Jpeg, 144, 96))
            {
                // キャプションの描画に使用されるテキスト書式。
                TextFormat tf = new TextFormat() { FontName = "Yu Gothic", FontSize = 12 };

                // さまざまなオプションを使用して画像を描画するアクション。
                Action<RawImage, Page, ImageAlign, bool> drawImage = (image_, page_, ia_, clip_) =>
                {
                    var rect = new RectangleF(72, 72, 72 * 4, 72 * 4);
                    var clipped = clip_ ? "4×4インチの矩形に切り取り" : "切り取りなし";
                    var align = ia_ == ImageAlign.Default ? "規定の配置" :
                        ia_ == ImageAlign.CenterImage ? "中央寄せ" :
                        ia_ == ImageAlign.StretchImage ? "矩形にあわせる" : "カスタム";
                // 画像のキャプションを描画します。
                page_.Graphics.DrawString($"{doc.Pages.IndexOf(page_) + 1}ページ: 画像の場所 (1\",1\"), {clipped}, 配置 {align}:", tf, new PointF(72, 36));
                    var clip = clip_ ? new Nullable<RectangleF>(rect) : new Nullable<RectangleF>();
                // 画像を描画します。
                page_.Graphics.DrawImage(image_, rect, clip, ia_, out RectangleF[] imageRects);
                // 画像のアウトラインを表示します。
                page_.Graphics.DrawRectangle(imageRects[0], Color.Red, 1, null);
                // 画像/クリップ領域を表示します。
                page_.Graphics.DrawRectangle(rect, Color.Blue, 1, null);
                };

                // ImageAlign クラスは、さまざまな画像の配置オプションを提供します。
                // また、一般的に使用されるオプションの組み合わせをいくつかの
                // 静的インスタンスとして定義しています。

                // ページ1:クリッピングせずにデフォルトの配置で画像を描画します。
                drawImage(image, doc.NewPage(), ImageAlign.Default, false);

                // ページ2:デフォルトの配置でクリッピングして画像を描画します。
                drawImage(image, doc.NewPage(), ImageAlign.Default, true);

                // ページ3:中央寄せ配置でクリッピングして画像を描画します。
                drawImage(image, doc.NewPage(), ImageAlign.CenterImage, true);

                // ページ4:クリッピングせずに画像を引き延ばして描画します。
                drawImage(image, doc.NewPage(), ImageAlign.StretchImage, false);

                // ページ5:クリッピングせず、アスペクト比を維持しながら矩形に収まるよう画像を引き延ばして描画します。
                ImageAlign ia = new ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, true, true, true, false, false);
                drawImage(image, doc.NewPage(), ia, false);

                // ページ6:クリッピングせず、アスペクト比を維持しながら矩形に収まるよう画像をタイル状に並べて描画します。
                ia = new ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, false, false, true, true, true);
                drawImage(imageSmall, doc.NewPage(), ia, false);

                // PDF ドキュメントを保存します。
                doc.Save(stream);
            }
        }
    }
}