トリミングの解像度を指定する必要があるのはなぜですか?
-
05-07-2019 - |
質問
C#で画像をトリミングする方法を書きました。新しいビットマップを作成し、元の画像から指定された長方形(トリミングする領域)を描画することでそれを行います。
試した画像については、間違った結果が生成されていました。結果の画像のサイズは適切でしたが、コンテンツはそれでした。画像が2倍に拡大されてから切り取られたかのようでした。最終的にこの行を追加すると修正されました:
result.setResolution(72, 72)
しかし、なぜ解像度が必要なのですか?私はピクセルで作業しているだけで、インチやセンチメートルでは使用していません。また、正しい解像度はどうなりますか?
完全なコードはこの拡張メソッドです:
public static Bitmap Crop(this Image image, int x, int y, int width, int height) {
Bitmap result = new Bitmap(width, height);
result.SetResolution(72, 72);
// Use a graphics object to draw the resized image into the bitmap.
using (Graphics graphics = Graphics.FromImage(result)) {
// High quality.
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
// Draw the image into the target bitmap.
graphics.DrawImage(image, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
}
return result;
}
解決
DrawImageの誤ったオーバーロードを使用しています。 SrcおよびDest四角形を指定するものを使用する必要があります。
graphics.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
試してみて、うまくいかない場合はコメントで知らせてください。
他のヒント
i答えは、ライブラリが実際に変更を行う方法にあると思われます。いくつかのメモリブロックをコピーして貼り付けるだけです。解像度は、ピクセルごとに使用されるビット/バイト数を指定します。コピーする必要があるバイト数を知るには、ピクセルごとに使用されるビット/バイト数を知る必要があります。
したがって、これはmemcopyが続く単純な乗算であると思います。
よろしく
所属していません StackOverflow