一昨日の
gogowaten.hatenablog.com
続き
- jpegの画質を指定できるようにした、最低10から最高の100
- 表示するページを指定できるようにした
- 保存されるjpegファイルサイズの予測を表示
- 表示する画像は指定した画質相当のものにした
- クリックで元のBitmap画像とjpeg画像を比較できるようにした
ダウンロード
PDFtoJPEG_1.1.zip
jpeg品質(画質)やページの変更は、更新ボタンを押すまで適用されない
予測ファイルサイズは今表示している1ページ分だけのもの
jpegの画質を指定できるようにした、最低10から最高の100
表示する画像は指定した画質相当のものにした
がさがさになるけど予測ファイルサイズは97KBと、かなり小さくなる
クリックで元のBitmap画像とjpeg画像を比較できるようにした
左クリックを押したり離したりで、どれくらい画質が劣化するのか見比べられる
表示するページを指定できるようにした
表示したいページ数に合わせてから、更新ボタンで表示される
保存されるjpegファイルサイズの予測を表示
2ページめを品質10のときの予測ファイルサイズは103KB、保存ボタンでjpeg作成
101KBってあるけどウィンドウズは1Kを1024で計算するからかな
103876/1024=101.44
だいたいあっている
表示してみると
こんなかんじ
jpeg画像の予測ファイルサイズの取得は
gogowaten.hatenablog.com
このときに使った方法の
Streamに一時保存してから読み込む方法
- private BitmapSource GetClipboardBitmapEncDec()
- {
- BitmapSource source = Clipboard.GetImage();
- if (source == null)
- {
- return null;
- }
- var encoder = new BmpBitmapEncoder();
- encoder.Frames.Add(BitmapFrame.Create(source));
- using (var stream = new System.IO.MemoryStream())
- {
- encoder.Save(stream);
- stream.Seek(0, System.IO.SeekOrigin.Begin);
- var decoder = new BmpBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
- source = decoder.Frames[0];
- }
- return source;
- }
これを使って表示すると
BitmapのEncoderとDecoderを使う方法から
private BitmapSource MakeJpegPreviewImage(BitmapSource source, int quality)
{
if (source == null) { return null; }
var encoder = new JpegBitmapEncoder();
JpegBitmapDecoder decoder;
encoder.QualityLevel = quality;
encoder.Frames.Add(BitmapFrame.Create(source));
using (var stream = new MemoryStream())
{
encoder.Save(stream);
stream.Seek(0, SeekOrigin.Begin);
decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
var fileSize = stream.Length / 1000;
if (fileSize > 1000)
{
tbFileSize.Text = $"{(stream.Length / 1000 / 1000.0).ToString(".0")} MB";
}
else
{
tbFileSize.Text = $"{stream.Length / 1000} KB";
}
}
return decoder.Frames[0];
}
EncoderでstreamにSaveしたときのstreamの長さ(length)が、そのままファイルサイズになるみたいだったので、これを表示するようにしただけ、1000KBを超えたらMBで表示するようにした
streamって長さがあるのね、長さってことは連なっている感じなんかなあ
保存部分の修正
前回は
private async Task SaveSub2(PdfDocument pdfDocument, double dpi, string directory, string fileName, int pageIndex, int quality, int keta)
{
using (PdfPage page = pdfDocument.GetPage((uint)pageIndex))
{
var options = new PdfPageRenderOptions();
options.DestinationHeight = (uint)Math.Round(page.Size.Height * (dpi / 96.0), MidpointRounding.AwayFromZero);
using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
await page.RenderToStreamAsync(stream, options);
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream.AsStream();
image.EndInit();
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = quality;
encoder.Frames.Add(BitmapFrame.Create(image));
pageIndex++;
string renban = pageIndex.ToString("d" + keta);
using (var fileStream = new FileStream(
System.IO.Path.Combine(directory, fileName) + "_" + renban + ".jpg", FileMode.Create, FileAccess.Write))
{
encoder.Save(fileStream);
}
}
}
}
この太字のところが意味なかった
Encoderに渡すBitmapFrameを作成するのに、streamから作成したBitmapImageを使っていたけど、streamから直接BitmapFrameを作成するようにした
前回:stream→BitmapImage→BitmapFrame
今回:stream→BitmapFrame
<summary>
</summary>
<param name="pdfDocument"></param>
<param name="dpi"></param>
<param name="directory"></param>
<param name="fileName"></param>
<param name="pageIndex"></param>
<param name="quality"></param>
<param name="keta"></param>
<returns></returns>
private async Task SaveSub2(PdfDocument pdfDocument, double dpi, string directory, string fileName, int pageIndex, int quality, int keta)
{
using (PdfPage page = pdfDocument.GetPage((uint)pageIndex))
{
var options = new PdfPageRenderOptions();
options.DestinationHeight = (uint)Math.Round(page.Size.Height * (dpi / 96.0), MidpointRounding.AwayFromZero);
using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
await page.RenderToStreamAsync(stream, options);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = quality;
encoder.Frames.Add(BitmapFrame.Create(stream.AsStream()));
pageIndex++;
string renban = pageIndex.ToString("d" + keta);
using (var fileStream = new FileStream(
System.IO.Path.Combine(directory, fileName) + "_" + renban + ".jpg", FileMode.Create, FileAccess.Write))
{
encoder.Save(fileStream);
}
}
}
}
短くなった
今回のでいろいろ使い勝手が良くなって、あとはマルチスレッドに対応できればなあ
関連記事
続きは翌日
gogowaten.hatenablog.com