كيفية حفظ عنصر تحكم picturebox كملف jpeg الملف بعد التعديل

StackOverflow https://stackoverflow.com/questions/1063505

  •  21-08-2019
  •  | 
  •  

سؤال

لدي PictureBox على تطبيق نماذج Windows.

أنا تحميل صورة و لقد مكن Paint الحدث في قانون بلدي.فإنه يرسم مستطيل.

مثل هذا:

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);
}

وأنا انقر على زر "حفظ":

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

ولكن حفظ الملف لا يحتوي على المستطيل الذي رسمته.

هل لدى أحدكم أي فكرة ؟

هل كانت مفيدة؟

المحلول

وأنت ربما لا ينبغي أن يوجه مباشرة على PictureBox.

وتحتاج إلى استخدام صورة نقطية بدلا من ذلك. محاولة وضع الصورة النقطية في PictureBox.Image ومن ثم استدعاء حفظ ().

هذا لمزيد من التفاصيل

نصائح أخرى

وThanks.Your الإجابة ساعد الجميع. عملت هذه

        private void button1_Click(object sender, EventArgs e)
    {
        pictureBox1.ImageLocation=@"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;
    }

وهنا هو بلدي حل مع دعم إضافي لأنواع الملفات المختلفة:

    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);
        }
    }

وهنا مثال صغير حيث أوضح عدد قليل من الأشياء بالنسبة لي (كنت تعاني من هذا قليلا جدا).

وpBox هو PictureBox في Form1 ومن جعله 50X50 على الأقل

وكانت مستمدة من appPath System.Reflection ولكن استخدام أي مسار تريد

وهناك اثنين من الأزرار، واحدة للرسم، واحدة لإنقاذ، انقر فوق الأحداث هم في التعليمات البرمجية أدناه.

والأشياء التي تعلمتها:

و(1) "pBox.Image =" لا تفعل أي شيء سوى تهيئة صورة pBox، فإنه ليس من الضروري أن يكون اسم الملف كما EVERY سبيل المثال لقد وجدت المستخدمة (كان إنقاذ إلى ذلك الملف نفسه مشكلة لأنه كان سهم مقفل ). أيضا، إذا كان هدفك هو أن نرى الأشياء على سطح السيطرة بأكملها، عليك ربما مثل تحديد حجم في وقت تهيئة لحجم ما تحتاجه. اعتدت حجم pBox في هذا المثال ولكن عادة ما يمكنني استخدام حجم الصورة (لأنني عادة ما تبدأ مع ملف صورة حقيقية).

و(2) كان لي دائما مشاكل إما رؤية بلدي توجه تظهر على التحكم أو رؤية تغييرات بلدي حفظها في ملف الإخراج (أو كليهما). في محاولاتي السابقة أود أن تكرار توجه سواء على السيطرة وعلى نقطية. بالطبع هذا ليس من الضروري ولكن نقطية تحريرها لا تحتاج إلى إعادة شحنها في control.image ... وكانت تلك هي قطعة من هذا اللغز كنت في عداد المفقودين.

و(A) إنشاء نقطية من control.image والاعتماد على نقطية

و(B) تحميل الصورة النقطية إلى control.Image (حتى تتمكن من رؤية التغييرات التي تسببها السحب)

و(C) حفظ control.Image

و(2-الخيار) لديك صورة نقطية العالمية (أو أقر) (وربما من ملف حقيقي)

و(A) رسم على نقطية

و(B) تحميل الصورة النقطية إلى control.Image (حتى تتمكن من رؤية التغييرات)

و(C) حفظ الصورة النقطية

    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");
    }

تحتاج الطلاء صورة من الصورة ، وليس إلى الرسومات السيطرة على الطلاء الحدث.

تحرير:

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

// ... somewhere else ...
pictureBox1.Save( _required_parameters_ );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top