cm 単位で画像のサイズを変更する C#
質問
10 X 6,88 cm の画像を要求する要件があります。1ピクセルのサイズはユーザーのディスプレイ解像度に依存するため、cmからピクセルに単純に変換できないことはわかっています。画像のサイズをcm単位に変更する方法があるかどうか知りたいです。(画像拡張子も保持する必要があります。例えば。:PDF やその他の拡張子に変換することはできません)
解決
ユーザーが画像を印刷する解像度に依存します(cm単位のサイズは、印刷時以外はほとんど意味がありません)。ユーザーが200 dpiなどで印刷する場合、画像は(10 / 2.54 * 200)x(6.88 / 2.54 * 200)ピクセルである必要があります(cmとインチの間の変換には2.54の分割が必要です) )。必要な解像度は、画像の種類とユーザーの品質要件に大きく依存します。
「X×Y cmにサイズを変更したい」と言うだけです。本当に意味がありません。
画像の必要なサイズがわかったら、実際のサイズ変更の方法のサンプルコードについては、このSOの回答でニーズが満たされるはずです。
他のヒント
実際には、画面上の画像サイズと印刷出力上の画像サイズを区別する必要があります。
通常、次の式が見つかります。
inches = pixels / dpi
したがって、次のようになります。
pixel = inches * dpi
実はこれ、印刷用なんです。
ディスプレイについては、dpi を ppi に置き換えれば完了です。
(私のように) インチに詳しくない人のために:
inches = pixels / dpi
pixel = inches * dpi
1 centimeter = 0.393700787 inch
pixel = cm * 0.393700787 * dpi
このルーチンは、モニター上に画像を X-cm 表示するためのピクセル サイズを計算します。
しかし、プリンタでは、PPI (bmp.horizontalResolution および bmp.VerticalResolution) ほど簡単に DPI を取得できないため、これはそれほど簡単ではありません。
public static int Cm2Pixel(double WidthInCm)
{
double HeightInCm = WidthInCm;
return Cm2Pixel(WidthInCm, HeightInCm).Width;
} // End Function Cm2Pixel
public static System.Drawing.Size Cm2Pixel(double WidthInCm, double HeightInCm)
{
float sngWidth = (float)WidthInCm; //cm
float sngHeight = (float)HeightInCm; //cm
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1, 1))
{
sngWidth *= 0.393700787f * bmp.HorizontalResolution; // x-Axis pixel
sngHeight *= 0.393700787f * bmp.VerticalResolution; // y-Axis pixel
}
return new System.Drawing.Size((int)sngWidth, (int)sngHeight);
} // End Function Cm2Pixel
使用法は次のようになります。
public System.Drawing.Image Generate(string Text, int CodeSize)
{
int minSize = Cm2Pixel(2.5); // 100;
if (CodeSize < minSize)
CodeSize = minSize;
if (string.IsNullOrEmpty(Text))
{
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(CodeSize, CodeSize);
using (System.Drawing.Graphics gfx = System.Drawing.Graphics.FromImage(bmp))
{
gfx.Clear(System.Drawing.Color.Black);
using(System.Drawing.Font fnt = new System.Drawing.Font("Verdana", 12, System.Drawing.FontStyle.Bold))
{
double y = CodeSize / 2.0 - fnt.Size;
gfx.DrawString("No Data", fnt, System.Drawing.Brushes.White, 5, (int)y, System.Drawing.StringFormat.GenericTypographic);
} // End Using fnt
} // End using gfx
return bmp;
} // End if (string.IsNullOrEmpty(Text))
...[Generate QR-Code]
return [Generated QR-Code]
}
JPGやTIFFなどの画像ファイル形式には、 EXIFヘッダーがあります。垂直DPI。
したがって、このメタデータを含む画像を取得した場合、印刷可能なサイズを確認できます。
double DPC = Image_DPI * 0.393700787;
double widthInCm = Image_Width * DPC;
double heightInCm = Image_Height * DPC;
if (widthInCm <= 10 && heightInCm <= 6.88) // do stuff
これらの印刷可能な寸法を決して超えないように画像のサイズを変更する必要がある場合は、逆にそれを行い、寸法W x Hの画像が10cm x 6.88cmの範囲内に収まるDPI比を計算できます。
フレドリックが言っていることの種類: 私は素敵なDPIを取り、その解像度以上の画像を必要としますが(同じ縦横比です)、画像をエクスポート/印刷するとき、他のプログラム/プリンタが使用するDPIに画像のサイズを変更します...
これはこれと同じくらい簡単かもしれません。ほとんどの画像は、1インチあたりのピクセル数を格納しています。画像の各次元のピクセル数を計算し、それをインチ数(cmから換算)で除算します。次に、元のビットを使用して、1インチあたりのピクセル数(またはより一般的には1インチあたりのドット数)のフィールドを変更します。
したがって、写真は3.93である必要があります&quot; x 2.71&quot;。画像が393px x 271pxの場合、dpiを100x100に設定します。画像が39px x 27pxの場合、dpiを10x10に設定します。
他の回答で説明されているように、おそらくサイズ変更を行う必要があります。 :)