単に印刷だけとかは検索すればあったのですが縦横比を維持して印刷というのが記事がなかなかなかったためまとめておきます。
環境: Windows 10 Pro, Unity 5.6.0f3
先にコード書いちゃいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
using UnityEngine; using System.Drawing; using System.IO; using System; using System.Drawing.Printing; public class PrintManager : MonoBehaviour { public string printFilePath; private PrintDocument pd; public void PrintImage(string filePath = null) { if (filePath != null) { printFilePath = filePath; } pd = new PrintDocument(); pd.OriginAtMargins = false; pd.DefaultPageSettings.Landscape = true; pd.PrintPage += new PrintPageEventHandler(PrintPage); pd.PrintController = new StandardPrintController(); try { pd.Print(); } catch (System.Exception ex) { Debug.LogError(ex.Message); } } private void PrintPage(object sender, PrintPageEventArgs e) { Image printImg = null; if (File.Exists(printFilePath)) { printImg = Image.FromFile(printFilePath); if (printImg != null) { DrawAspectFillImage(e, printImg); printImg.Dispose(); File.Delete(printFilePath); } } // 次のページがないことを通知する e.HasMorePages = false; } public void DrawAspectFillImage(PrintPageEventArgs e, Image image) { System.Drawing.Graphics graphics = e.Graphics; if (image == null) return; RectangleF marginBounds = e.MarginBounds; RectangleF printableArea = e.PageSettings.PrintableArea; int availableWidth = (int)Math.Floor(pd.OriginAtMargins ? marginBounds.Width : (e.PageSettings.Landscape ? printableArea.Height : printableArea.Width)); int availableHeight = (int)Math.Floor(pd.OriginAtMargins ? marginBounds.Height : (e.PageSettings.Landscape ? printableArea.Width : printableArea.Height)); float ratio = (float)image.Height / (float)image.Width; int printHeight = Mathf.FloorToInt(availableWidth * ratio); int marginHeight = (availableHeight - printHeight) / 2; //graphics.DrawRectangle(Pens.Red, 0, 0, availableWidth - 1, availableHeight - 1); graphics.DrawImage(image, 0, marginHeight, availableWidth, printHeight); } } |
using System.Drawing;しているので System.drawing.dll が必要です。自分の環境では C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.drawing.dll にありました。これをコピーして Plugins フォルダに入れてください。
関数名そのままですが DrawAspectFillImageで縦横比維持のコードを書いています。
参照1: http://qiita.com/nanokanato/items/959137ba37428a64f3d3
参照2: http://stackoverflow.com/questions/8761633/how-to-find-the-actual-printable-area-printdocument
コメントを残す