4

フォームのボタンを押したときにトリミングしたい画像があります。ボタンが押されたときに実行される次のコードがありますが、画像には何もしません。

try
{
  Image image = Image.FromFile("test.jpg");
  Bitmap bmp = new Bitmap(200, 200, PixelFormat.Format24bppRgb);
  bmp.SetResolution(80, 60);

  Graphics gfx = Graphics.FromImage(bmp);
  gfx.SmoothingMode = SmoothingMode.AntiAlias;
  gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
  gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
  gfx.DrawImage(image, new Rectangle(0, 0, 200, 200), 10, 10, 200, 200, GraphicsUnit.Pixel);
  // Dispose to free up resources
  image.Dispose();
  bmp.Dispose();
  gfx.Dispose();
}
catch (Exception ex)
{
  MessageBox.Show(ex.Message);
}     

私の画像は、実際には次のコードを含むフォームのアクティブなウィンドウのスクリーンショットです。

Rectangle bounds = this.Bounds;
using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
{
  using (Graphics g = Graphics.FromImage(bitmap))
  {
    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
  }
  bitmap.Save("test.jpg", ImageFormat.Jpeg);
}

これを完了するには、同じボタンを押すだけで、最初にフォームのスクリーンショットを撮り、次にその画像をトリミングしたいのですが、トリミングが機能しません。何故ですか?

4

4 に答える 4

3

あなたのコードは、トリミングされた画像を保存するために私が使用しているものに近いものです。トリミングされた画像を保存する部分がありません。切り取った画像をバイト ストリームに書き込んでから、ディスクに保存する必要があります。あなたのコードを修正しました。テストされていませんが、試してみてください。

try
{
    Image image = Image.FromFile("test.jpg");
    Bitmap bmp = new Bitmap(200, 200, PixelFormat.Format24bppRgb);
    bmp.SetResolution(80, 60);

    Graphics gfx = Graphics.FromImage(bmp);
    gfx.SmoothingMode = SmoothingMode.AntiAlias;
    gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
    gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
    gfx.DrawImage(image, new Rectangle(0, 0, 200, 200), 10, 10, 200, 200, GraphicsUnit.Pixel);

    //Need to write the file to memory then save it
    MemorySteam ms = new MemoryStream();
    bmp.Save(ms, image.RawFormat); 
    byte[] buffer = ms.GetBuffer();

    var stream = new MemorySteam((buffer), 0, buffer.Length); 
    var croppedImage = SD.Image.FromStream(steam, true);
    croppedImage.Save("/your/path/image.jpg", croppedImage.RawFormat);

    // Dispose to free up resources
    image.Dispose();
    bmp.Dispose();
    gfx.Dispose();
    stream.Dispose();
    croppedImage.Dispose();

}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
于 2012-04-25T15:42:18.927 に答える
0

結果は変数 bmp になります。あなたはそれに取り組み続けることができます。そのオブジェクトを破棄すると、変更内容はもちろん失われます。

于 2012-04-25T13:44:05.723 に答える
0

Bitmap クラスの Clone メソッド ( http://msdn.microsoft.com/en-us/library/ms141944.aspx ) を使用して、ターゲット Bitmap のサブ長方形を取得できます。

于 2012-04-25T13:44:00.417 に答える
-1

私は私のプロジェクトの 1 つの方法を作成しました。

   public void ResizeImage(string sImageFile, decimal dWidth, decimal dHeight, string sOutputFile)
    {
        Image oImg = Bitmap.FromFile(sImageFile);
        Bitmap oBMP = new Bitmap(decimal.ToInt16(dWidth), decimal.ToInt16(dHeight));

        Graphics g = Graphics.FromImage(oBMP);
        g.PageUnit = pgUnits;
        g.SmoothingMode = psMode;
        g.InterpolationMode = piMode;
        g.PixelOffsetMode = ppOffsetMode;

        g.DrawImage(oImg, 0, 0, decimal.ToInt16(dWidth), decimal.ToInt16(dHeight));

        ImageCodecInfo oEncoder = GetEncoder();
        EncoderParameters oENC = new EncoderParameters(1);

        oENC.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, plEncoderQuality);

        oImg.Dispose();

        oBMP.Save(sOutputFile, oEncoder, oENC);
        g.Dispose();

    }
于 2012-04-25T13:46:27.307 に答える