1

pictureBoxに画像を描画しましたが、フォルダに保存したいと思います。私は何もうまくいかない多くの方法を試しました。休閑コードを使って絵を描いています。テキストボックスの値に基づいて画像を描画しています。

 private void btnTransferBottleRegenerate_Click(object sender, EventArgs e)
    {

        float[] volumetransfer = new float[1];
        volumetransfer[0] = float.Parse(txtTransferVolume.Text);

        int[] percentages = new int[6];
        percentages[0] = int.Parse(txtTransferNotIdentified.Text);
        percentages[1] = int.Parse(txtTransferWaterBasedMud.Text);
        percentages[2] = int.Parse(txtTransferOilBasedMud.Text);
        percentages[3] = int.Parse(txtTransferWater.Text);
        percentages[4] = int.Parse(txtTransferHydrocarbonLiq.Text);
        percentages[5] = int.Parse(txtTransferGas.Text);

        Color[] colors = new Color[6];
        colors[0] = Color.Gray;
        colors[1] = Color.Chocolate; 
        colors[2] = Color.SaddleBrown;
        colors[3] = Color.Blue;
        colors[4] = Color.Red;
        colors[5] = Color.Lime;

        // Finally, call the method 
        DrawPercentages(percentages, colors, volumetransfer);

        //string filename = Application.StartupPath + "\\volumetransfer.jpg";

       // pictureBox1.Image.Save(Application.StartupPath + "\\Image\\picture1.jpg");
      //  pictureBox1.Refresh();
      //  if (pictureBox1 != null)
       // {
            pictureBox1.Image.Save(Application.StartupPath + "\\test.bmp");
       // }
    }

    private void DrawPercentages(int[] percentages, Color[] colors, float[] volumetransfer)
    {
        // Create a Graphics object to draw on the picturebox
        Graphics G = pictureBox1.CreateGraphics();

        // Calculate the number of pixels per 1 percent
        float pixelsPerPercent = pictureBox1.Height / volumetransfer[0];

        // Keep track of the height at which to start drawing (starting from the bottom going up)
        int drawHeight = pictureBox1.Height;

        // Loop through all percentages and draw a rectangle for each
        for (int i = 0; i < percentages.Length; i++)
        {
            // Create a brush with the current color
            SolidBrush brush = new SolidBrush(colors[i]);
            // Update the height at which the next rectangle is drawn.
            drawHeight -= (int)(pixelsPerPercent * percentages[i]);
            // Draw a filled rectangle
            G.FillRectangle(brush, 0, drawHeight, pictureBox1.Width, pixelsPerPercent * percentages[i]);
        }
    }

}

}

「再生成」ボタンをクリックすると、pictureBoxに画像が描画されます。その後、フォルダに保存します。こんなデザインです。

4

2 に答える 2

1

解決策は、ビットマップに描画し、それを の画像として設定してPictureBoxから保存することです。

private void DrawPercentages(int[] percentages, Color[] colors, float[] volumetransfer){
   Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
   using(Graphics G = Graphics.FromImage(bmp)){
       //...
   }

   pictureBox1.Image = bmp;
}

そして、コードは問題なく完全に機能するはずです。

于 2013-02-07T17:49:59.717 に答える
0

まず、ウィンドウのサイズが変更された場合でも、描画された画像が表示されたままになるように(より良い:再ペイントされた) 、正しいイベント内でペイントする必要があります。 PictureBox1_Paint

その後、@ Hans Passantによって投稿されたスニペットを利用できます-グラフィックスオブジェクト保存して、描画した画像をディスクに保存する方法。

// global to be accesible within paint
float[] volumetransfer = new float[1];
int[] percentages = new int[6];
Color[] colors = new Color[6];

private void btnTransferBottleRegenerate_Click(object sender, EventArgs e)
{            
    /// initialization goes here

    // force pictureBox to be redrawn
    // so resizing your window won't let your rectangles disapear
    pictureBox1.Invalidate();

    using (var bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height))
    {
        pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
        bmp.Save(@"e:\temp\test.png"); //Application.StartupPath + "\\Image\\picture1.jpg"
    }
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    // use GraphicsObject of PaintEventArgs
    Graphics G = e.Graphics;

    float pixelsPerPercent = pictureBox1.Height / volumetransfer[0];
    int drawHeight = pictureBox1.Height;

    for (int i = 0; i < percentages.Length; i++)
    {
        SolidBrush brush = new SolidBrush(colors[i]);
        drawHeight -= (int)(pixelsPerPercent * percentages[i]);
        G.FillRectangle(brush, 0, drawHeight, pictureBox1.Width, pixelsPerPercent * percentages[i]);
    }           
}

一方DrawPercentage(..)、新しい画像を返すこともできます。後で画像ボックスに割り当てて、次のように保存することができます。pictureBox1.Image.Save(...)

private void button1_Click(object sender, EventArgs e)
{
    float[] volumetransfer = new float[1];
    int[] percentages = new int[6];
    Color[] colors = new Color[6];

    /// initialization goes here

    pictureBox1.Image = CreateImage(volumetransfer, percentages, colors);
    pictureBox1.Image.Save(@"e:\temp\test.png");
}

private Image CreateImage(float[] volumetransfer, int[] percentages, Color[] colors)
{
    Image img = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    Graphics g = Graphics.FromImage(img);

    float pixelsPerPercent = pictureBox1.Height / volumetransfer[0];
    int drawHeight = pictureBox1.Height;

    for (int i = 0; i < percentages.Length; i++)
    {
        SolidBrush brush = new SolidBrush(colors[i]);
        drawHeight -= (int)(pixelsPerPercent * percentages[i]);
        g.FillRectangle(brush, 0, drawHeight, pictureBox1.Width, pixelsPerPercent * percentages[i]);
    }

    return img;
}
于 2013-02-07T17:51:36.107 に答える