2

アスペクト比が 4:3 から 4:3 よりも高い画像をトリミングするための計算方法を理解するのに苦労しています。

たとえば、サイズを変更してから 4:3 にトリミングしたい 16:9 の画像があるとします。

サイズ変更ビットは既に機能していますが、同じアスペクト比を維持しています。使用する必要があることはわかってGraphics.DrawImage()いますが、パラメーターがどうあるべきか、それらのパラメーターをどのように導出するかは完全にはわかりません。

私が知っていることは次のとおりです。

var dimension = (double)bigSide/smallSide
if(dimension > 1.4)
{
  Graphics.DrawImage(resImage, new Rectangle(?, ?, ?, ?), ?, ?, ?, ?, GraphicsUnit.Pixel);
}

これらの疑問符はすべて、私が理解できないパラメーターです。また、画像を 4:3 に縮小するためにどのような計算が必要になるかはわかりません。

基本的に、4:3 アスペクトよりも幅の広い画像 (中央) の側面を切り取りたいだけです。明らかに、横長ではなく縦長の画像の上部と下部をカットします。

どんな助けでも大歓迎です。

ティア

4

3 に答える 3

7

トリミングされた画像のサイズを小さくしたいというコメントも見ましたよね?

Image resizeImg(Image img, int width)
    {
        // 4:3 Aspect Ratio. You can also add it as parameters
        double aspectRatio_X = 4;
        double aspectRatio_Y = 3;                        
        double targetHeight = Convert.ToDouble(width) / (aspectRatio_X / aspectRatio_Y);

        img = cropImg(img);
        Bitmap bmp = new Bitmap(width, (int)targetHeight);
        Graphics grp = Graphics.FromImage(bmp);
        grp.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
        return (Image)bmp;

    }

    Image cropImg(Image img)
    {
        // 4:3 Aspect Ratio. You can also add it as parameters
        double aspectRatio_X = 4;
        double aspectRatio_Y = 3;

        double imgWidth = Convert.ToDouble(img.Width);
        double imgHeight = Convert.ToDouble(img.Height);

        if (imgWidth / imgHeight > (aspectRatio_X / aspectRatio_Y))
        {
            double extraWidth = imgWidth - (imgHeight * (aspectRatio_X / aspectRatio_Y));
            double cropStartFrom = extraWidth / 2;
            Bitmap bmp = new Bitmap((int)(img.Width - extraWidth), img.Height);
            Graphics grp = Graphics.FromImage(bmp);                                                
            grp.DrawImage(img, new Rectangle(0, 0, (int)(img.Width - extraWidth), img.Height), new Rectangle((int)cropStartFrom, 0, (int)(imgWidth - extraWidth), img.Height), GraphicsUnit.Pixel);
            return (Image)bmp;
        }
        else
            return null;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        pictureBox2.Image = resizeImg(pictureBox1.Image, 60);
    }

resize メソッドを使用し、幅をパラメーターとして指定します。切り抜き方式なので高さを足す必要はありません。

于 2013-08-28T19:56:06.727 に答える
1

概念を理解できるように、幅の広い画像をトリミングする方法を次に示します。

まず、画像の余分な幅を計算します。つまり、同じ 4:3 の比率よりも多くの追加スペースが必要です。

1366 x 768 の画像を 1024 x 768 にトリミングしたいとします。

ここで、高さ (768px) で extra_width を計算できます。

4 / 3 * (768) = 1024

これで、高さ 768 のターゲット幅が得られます。

余分な幅は次のとおりです。

1366 - 1024

開始トリミング ポイントを extra_width の 1/2 に配置し、full_height を選択することで、画像をトリミングできます。

  Image cropImg(Image img)
    {
        // 4:3 Aspect Ratio. You can also add it as parameters
        double aspectRatio_X = 4;
        double aspectRatio_Y = 3;

        double imgWidth = Convert.ToDouble(img.Width);
        double imgHeight = Convert.ToDouble(img.Height);

        if (imgWidth / imgHeight > (aspectRatio_X / aspectRatio_Y))
        {
            double extraWidth = imgWidth - (imgHeight * (aspectRatio_X / aspectRatio_Y));
            double cropStartFrom = extraWidth / 2;
            Bitmap bmp = new Bitmap((int)(img.Width - extraWidth), img.Height);
            Graphics grp = Graphics.FromImage(bmp);                                                
            grp.DrawImage(img, new Rectangle(0, 0, (int)(img.Width - extraWidth), img.Height), new Rectangle((int)cropStartFrom, 0, (int)(imgWidth - extraWidth), img.Height), GraphicsUnit.Pixel);
            return (Image)bmp;
        }
        else
            return null;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        pictureBox2.Image = cropImg(pictureBox1.Image);
    }
于 2013-08-28T19:34:13.510 に答える