質問

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が続く単純な乗算であると思います。

よろしく

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top