using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Reflection; // Assembly.
// UWP-APIの使用
using Windows.Data.Pdf;
// ref:https://water2litter.net/rum/post/cs_pdf_wpf/
using EncType = System.Drawing.Imaging.Encoder;// 別名
using EncParamType = System.Drawing.Imaging.EncoderParameter;//別名
namespace ImageParams
{
using EncType = System.Drawing.Imaging.Encoder;// 別名
using EncParamType = System.Drawing.Imaging.EncoderParameter;//別名
///
/// BitMapのSaveに使うImage Encodeパラメータの設定値の生成.
/// var enc = new ImageParams.EncData("jpeg");
/// //enc.SetImageType("PNG");
/// bitmap.Save(xxx, enc.GetInfo(),enc.GetParams());
///
///
public class EncData {
// SEE:https://dobon.net/vb/dotnet/graphics/encoderparameters.html
private string ImageType = "jpeg";
public EncData(string imageType = "jpeg") {
SetImageType(imageType);
}
public long JpegQuality { get; set; } = 91;// 指定しないときの値は91と一致する
///
/// イメージパラメータを設定する こんな感じで
///
///
///
public EncData SetImageType(string imageType) {
imageType = imageType.ToLower();
if (imageType == "jpeg" || imageType == "jpg") {
ImageType = "jpeg";
} else if (imageType == "png") {
ImageType = "png";
} else if (imageType == "tif" || imageType == "tiff") {
ImageType = "tiff";
} else {
ImageType = imageType;// 小文字を設定
}
return this;
}
public int SaveImage(System.Drawing.Bitmap bitmap, string path, string imageType = null) {
var p = GetParams();
string imType = imageType?.ToLower();
if (p != null) {
bitmap.Save(path, GetInfo(imType), GetParams());// imageTypeがnullならSetImageType()のものが使われる
} else {
// パラメータが空の場合
var imageFormat = new System.Drawing.Imaging.ImageFormat(GetInfo(imType).FormatID);
bitmap.Save(path, imageFormat);
}
return 0;
}
public System.Drawing.Imaging.EncoderParameters GetParams() {
var encList = new List();
//encList.Clear();
// 今はJPEGパラメータだけ
encList.Add(new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, JpegQuality));
//...
// 結合
var eps = new System.Drawing.Imaging.EncoderParameters(encList.Count);
for (var i = 0; i < encList.Count; i++)
eps.Param[i] = encList[i];
return eps;
}
public System.Drawing.Imaging.ImageCodecInfo GetInfo(string it=null) {
if ( it != null) {
var ici = GetEncoderInfo($"image/{it}");
return ici;
} else {
var ici = GetEncoderInfo($"image/{ImageType}");
return ici;
}
}
public static void GetSupportedParameters(System.Drawing.Bitmap bitmap1=null) {
// https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/advanced/how-to-determine-the-parameters-supported-by-an-encoder
// 現状Errorが発生して取得できない
try {
if (bitmap1 == null) {
bitmap1 = new System.Drawing.Bitmap(100, 100);
var destBitmapData = bitmap1.LockBits(
new System.Drawing.Rectangle(0, 0, 100, 100),
System.Drawing.Imaging.ImageLockMode.ReadOnly,
bitmap1.PixelFormat
);
bitmap1.UnlockBits(destBitmapData);
}
var jpgEncoder = GetEncoderInfo(System.Drawing.Imaging.ImageFormat.Tiff);
var paramList = bitmap1.GetEncoderParameterList(jpgEncoder.Clsid);
var encParams = paramList.Param;
for (int i = 0; i < encParams.Length; i++) {
Console.WriteLine("Param " + i + " holds " + encParams[i].NumberOfValues +
" items of type " +
encParams[i].ValueType + "\r\n" + "Guid category: " + encParams[i].Encoder.Guid + "\r\n");
}
} catch (Exception e) {
Console.WriteLine($"Ignore error ={e.ToString()}");
}
}
// inner method.
//ImageFormatで指定されたImageCodecInfoを探して返す
private static System.Drawing.Imaging.ImageCodecInfo GetEncoderInfo(System.Drawing.Imaging.ImageFormat f) {
var encs = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
foreach (var enc in encs) {
if (enc.FormatID == f.Guid) {
return enc;
}
}
return null;
}
private static System.Drawing.Imaging.ImageCodecInfo GetEncoderInfo(string mineType) {
//GDI+ に組み込まれたイメージ エンコーダに関する情報をすべて取得
System.Drawing.Imaging.ImageCodecInfo[] encs = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
//指定されたMimeTypeを探して見つかれば返す
foreach (System.Drawing.Imaging.ImageCodecInfo enc in encs) {
if (enc.MimeType == mineType) {
return enc;
}
}
return null;
}
}
}
namespace CSRender {
class Program {
static string outuptImageDir = "";// /O
static string dpi = "72.0";// /D
#if non
static string boxSelect = "C"; //B
static string pageRange = ""; //P
static string inputList = ""; //L
static string offset = ""; //OFFSET
static string overprint = ""; //OP
static string tempDir = ""; //T
static string fileUpdate = ""; //U
#endif
static string mode = "page"; //MODE
static string imageType = "JPG"; //JPG or /PNG
static string jpegQ = "91"; //JPEGQ
static void DispHelp() {
var pgName = Path.GetFileName(Path.GetFileName(Assembly.GetExecutingAssembly().Location));// プログラム名
string msg =
$"{pgName} [/] \n"
+$"* Render of PDF file\n"
+$"\t/F : pdfPath(pdfファイル名) /Fは省略可能\n"
+$"\t/O