Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8901

PNG画像の解像度を保持しておいて、設定し直したら予期せぬ値になっていた話

$
0
0

環境

Windows 10 Pro
Visual Studio 2017 Professional
Magick.NET-Q16-AnyCPU v7.14

事象

  1. PNG画像を読み込んで、オリジナルの解像度を取得しておく
  2. 途中、色々な処理をする(別拡張子で保存したりとかもする)
  3. 最後に、手順1で取得したオリジナルの解像度をppiで設定する → あら不思議、おかしな値が入ってるじゃないの

結論

事象を読んで気づいた方もいらっしゃるかと思いますが、問題があったのはここ。

  1. PNG画像を読み込んで、オリジナルの解像度を取得しておく

ここを、以下のようにすればいい。

  1. PNG画像を読み込んで、単位をppiにしてからオリジナルの解像度を取得しておく

なぜこのようなことが?

私も今回調べて初めて知りましたが、PNGはピクセルの物理サイズは持っていますが、ppiとかの情報はもっていないようです。
なので、物理的なピクセルサイズをinch(2.54)で割ってあげれば、一応ppiは出せます。が、端数は出る。

この辺りのことは、私もさらっとしか調べていませんが、興味のある方は「PNG pHYs」みたいなキーワードとかで調べてみてください。
(そして、この記事の内容が間違っていたら教えてください…)

再現コード(抜粋)

意図せぬ値が設定されていたコード

stringinPath="";// 入力画像のパスstringoutPath="";// 最終出力画像のパスdoubledensityX;using(MagickImageimg=newMagickImage(inPath)){// オリジナルのdensityを取得densityX=img.Density.X;}/* 色々処理 */stringtempPath="";// 色々処理した結果の一時ファイルのパスusing(MagickImageimg=newMagickImg(tempPath){// 解像度を設定img.Density=newDensity(densityX,DensityUnit.PixelsPerInch);// 保存img.Write(outPath);}

修正後

stringinPath="";// 入力画像のパスstringoutPath="";// 最終出力画像のパスdoubledensityX;using(MagickImageimg=newMagickImage(inPath)){// 単位をPixelsPerInchに替えてからdensityを取得Densitydensity=mImg.Density.ChangeUnits(DensityUnit.PixelsPerInch);densityX=density.X;}/* 色々処理 */stringtempPath="";// 色々処理した結果の一時ファイルのパスusing(MagickImageimg=newMagickImg(tempPath){// 解像度を設定img.Density=newDensity(densityX,DensityUnit.PixelsPerInch);// 保存img.Write(outPath);}

Viewing all articles
Browse latest Browse all 8901

Trending Articles