2009-06-30 39 views
9

Tôi có một PictureBox trên ứng dụng Windows Forms của mình.Cách lưu điều khiển hình ảnh dưới dạng tệp jpeg sau khi được chỉnh sửa

Tôi tải ảnh trong đó và tôi đã bật sự kiện Paint trong mã của mình. Nó vẽ một hình chữ nhật.

Như thế này:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics gr = e.Graphics; 
    Pen p = new Pen(Color.Red); 
    p.Width = 5.0f; 
    gr.DrawRectangle(p, 1, 2, 30, 40); 
} 

Và tôi nhấp vào nút "save":

private void button2_Click(object sender, EventArgs e) 
{ 
    pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg); 
} 

Nhưng những tập tin lưu không bao giờ chứa hình chữ nhật mà tôi đã vẽ.

Có ai có ý tưởng nào không?

Trả lời

5

Bạn có lẽ không nên vẽ trực tiếp trên PictureBox.

Bạn cần sử dụng Bitmap thay thế. Thử đặt bitmap vào PictureBox.Image và sau đó gọi Save().

Kiểm tra this để biết thêm chi tiết

1

Bạn cần vẽ hình ảnh của hình ảnh, không phải điều khiển đồ họa trên sự kiện Paint.

EDIT:

using(Graphics g = Graphics.FromImage(pictureBox1.Image)) { 
    // there you will be do, what you do in Paint event 
} 

// ... somewhere else ... 
pictureBox1.Save(_required_parameters_); 
+2

Hi Bạn có thể làm rõ/cung cấp cho một ví dụ? – tguclu

5

Thanks.Yourwers all helps. này đã làm việc

 private void button1_Click(object sender, EventArgs e) 
    { 
     [email protected]"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000.jpg" ; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg); 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 

    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Bitmap bmp = new Bitmap(pictureBox1.Image); 
     Graphics gr = Graphics.FromImage(bmp); 
     Pen p = new Pen(Color.Red); 
     p.Width = 5.0f; 
     gr.DrawRectangle(p, 1, 2, 30, 40); 
     pictureBox1.Image = bmp; 
    } 
+2

Bạn đã sử dụng mẫu "using (...) {...}". Bây giờ, bạn có thể có một số rò rỉ bộ nhớ. Và nếu một số câu trả lời giải quyết câu trả lời của bạn, bạn nên chấp nhận câu trả lời đó;). – TcKs

3

Đây là giải pháp của tôi với sự hỗ trợ bổ sung cho các loại tập tin khác nhau:

public void ExportToBmp(string path) 
    { 
     using(var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height)) 
     { 
     pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle); 
     ImageFormat imageFormat = null; 

     var extension = Path.GetExtension(path); 
     switch (extension) 
     { 
      case ".bmp": 
       imageFormat = ImageFormat.Bmp; 
       break; 
      case ".png": 
       imageFormat = ImageFormat.Png; 
       break; 
      case ".jpeg": 
      case ".jpg": 
       imageFormat = ImageFormat.Jpeg; 
       break; 
      case ".gif": 
       imageFormat = ImageFormat.Gif; 
       break; 
      default: 
       throw new NotSupportedException("File extension is not supported"); 
     } 

     bitmap.Save(path, imageFormat); 
     } 
    } 
3

Dưới đây là một ví dụ nhỏ mà làm sáng tỏ một vài điều cho tôi (tôi đã phải vật lộn với điều này một chút quá).

pBox là một PictureBox trên Form1, làm cho nó ít nhất 50x50

appPath được bắt nguồn từ System.Reflection nhưng sử dụng bất kỳ đường dẫn mà bạn muốn

Có hai nút, một cho bản vẽ, một cho tiết kiệm, sự kiện nhấp chuột của họ nằm trong mã bên dưới.

Những điều tôi học được:

(1) "pBox.Image =" không làm gì cả nhưng khởi tạo hình ảnh pBox, nó KHÔNG phải là một tên tập tin như MỌI ví dụ tôi tìm thấy sử dụng (tiết kiệm có vấn đề vào cùng một tệp đó vì nó đã được chia sẻ bị khóa). Ngoài ra, nếu mục tiêu của bạn là nhìn thấy mọi thứ trên bề mặt của toàn bộ điều khiển, có thể bạn sẽ muốn đặt kích thước lúc khởi tạo với kích thước bạn cần. Tôi đã sử dụng kích thước của pBox trong ví dụ này nhưng thông thường tôi sử dụng kích thước bitmap (vì tôi thường bắt đầu với một tệp hình ảnh thực).

(2) Tôi luôn gặp sự cố khi thấy các hình vẽ hiển thị trên điều khiển hoặc nhìn thấy các thay đổi của tôi được lưu trong tệp đầu ra (hoặc cả hai). Trong các nỗ lực trước đây của tôi, tôi sẽ lặp lại các bản vẽ cả trên điều khiển và trên bitmap. Tất nhiên điều đó là không cần thiết nhưng bitmap chỉnh sửa DOES cần phải được tải lại vào control.image ... và đó là phần của câu đố này tôi đã mất tích.

(A) Tạo một bitmap từ control.image và vẽ trên bitmap

(B) Load bitmap vào control.Image (do đó bạn có thể thấy những thay đổi gây ra bởi sự bốc thăm)

(C) Lưu control.Image

(2-tùy chọn) Bạn có một bitmap toàn cầu (hoặc thông qua) (có thể là từ một tập tin thực)

(A) Vẽ trên bitmap

(B) Load bitmap vào control.Image (để bạn có thể xem các thay đổi)

(C) Lưu bitmap

public Form1() 
    { 
     InitializeComponent(); 
     pBox.Image = new Bitmap(pBox.Width, pBox.Height); 
    } 

    private void DrawStuff1_Click(object sender, EventArgs e) 
    { 
     Bitmap bmp = new Bitmap(pBox.Image); 
     Graphics g = Graphics.FromImage(bmp); 

     g.FillRectangle(Brushes.Red, 5, 5, 25, 25); //hard-coded size to reduce clutter 

     pBox.Image = bmp; //this makes your changes visible 
    } 

    private void Save_Click(object sender, EventArgs e) 
    { 
     pBox.Image.Save(appPath + "SavedImage.bmp"); 
    } 
Các vấn đề liên quan