c یه مثال از یه متغییر Bitmap هست . شما وقتی متغییر بیت مپتون رو ساختید باید از اون استفاده کنید . اصل متد Save بود که آقای احسانی در قالب یه مثال بهتون نحوه استفاد ازش رو نشون دادن .
اگه یه پیکچر باکسم داشته باشید مثلا pictureBox1 یه . بعدش بزنید و Image و باز دوباره . رو بزنید متد save رو اونجا هم پیدا میکنید . (یعنی pictureBox1.Image.Save که سیو یه متد هست که بقیش مشخصه )
دیگه اینکه از کدوم اینها استفاده کنید برمیگرده به کارتون و نظر شخصی خودتون .
بله شما کاملا درست میفرمایین....ولی خودتون یه نگاهی به تصاویر زیر بندازین ....من واقعا نمیدونم دیگه باید چیکارش کنم؟!!
در تصویر زیر اومدم یک سری تصویر انداختم بعد خواستم save ش کنم که این پیغام اومد:
در این تصویر گزینه yes رو زدم تا مکان پیش فرضی که تعیین کرده رو نمایش بده:
در اینجا به محض اینکه میخوام کار save رو انجام بده این خطا رو برمیگردونه:
این یه مثال ساده از نحوه کار با سیو پیکچر باکس و سیو یه بیت مپ هست .
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
namespace load_and_save_image
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);
bitmap = new Bitmap(openFileDialog1.FileName);
AlterImage(bitmap);
}
}
//این رو همینطوری نوشتم تا یه تغییری فقط روی عکس درون بیت مپ ایجاد کنه . همین برای عملیات سیو اصلا ضروری نیست .
private void AlterImage(Bitmap bitmap)
{
for (int i = 0; i < bitmap.Height; i++)
{
bitmap.SetPixel(i/2, i/2, Color.Blue);
}
عکس تو پیکچر باکس بدون تغییر ذخیره میشه و عکس در بیت مپ رو به یه تغییر کوچیک توش ذخیره میکنه . ( خواستم نشون بدم که اگه تغییراتی روی عکس هم بدید بدون مورد ذخیره میشه .
اون اروری هم که در مورد GDI+ (a generic error has occured in GDI+) میگیرید مفصل اینجا توضیح داده : Bitmap and Image constructor dependencies
توضیحات بیشتر در اینجا داده شده (هم سورس کد و هم فایل پروژه ) Save File Dialog و اینجا هم فایل پروژه : Save File Dialog
عکس تو پیکچر باکس بدون تغییر ذخیره میشه و عکس در بیت مپ رو به یه تغییر کوچیک توش ذخیره میکنه . ( خواستم نشون بدم که اگه تغییراتی روی عکس هم بدید بدون مورد ذخیره میشه .
خیلی ممنونم هم از بابت توضیحات مفیدتون و هم از بابت مثال زیبا و جالبی که فرستادین، اما آقای حسنپور من برنامتونو اجرا گرفتم کار open رو خیلی زیبا انجام میداد اما برای save به این خطا برمیخوره، میشه نگاهی به تصاویر زیر بندازین و بفرمایین که آیا من اشتباه دارم استفاده میکنم یا اینکه برنامه ....... در جایی مشکل داره؟
سیو هم با پیکچر باکس و هم با بیت مپ جفتش این ارور رو میده یا اینکه نه این ارور مال وقتی هست که سعی دارید از بیت مپ استفاده کنید ؟
احتمالا شما عکس رو که میخوایید سیو کنید روی همون عکس قبلی این کارو نمیکنید ؟ (منظورم عکس رو overwrite میکنید /؟ )
سعی کنید عکس رو یه جای دیگه ذخیره کنید ببینید بهتون ارور میده یا نه .
اگه وقتی که دارین این عکس رو روی خودش ذخیره میکنید (Overwirte) میکنید این ارور بهتون داده میشه بخاطر این هست که موقع استفاده از یه عکس ( یا فایل ) اون بصورت موقت لاک میشه . . برای اینکه بهتون ارور نده . شما میتونید از دوتا بیت مپ استفاده کنید . یعنی عکس رو اول بخونید تو یه متغییر بیت مپ دیگه و بعد از بیت مپ دوم استفاده کنید .
سیو هم با پیکچر باکس و هم با بیت مپ جفتش این ارور رو میده یا اینکه نه این ارور مال وقتی هست که سعی دارید از بیت مپ استفاده کنید ؟
اون تصاویری که فرستادم همونطور که مشاهده کردین برای UsingPicture بود و این تصاویری که الان خدمتتون میفرستم برای Bitmap هست ، ملاحظه بفرمایین:
این اون کدیه که خودتون فرستادین:
اینجا Usingmap رو انتخاب میکنم:
بعد گزینه load رو انتخاب میکنم که بیاد یک تصویر رو انتخاب کنم:
تصویر رو انتخاب میکنم:
وقتی save میزنم این خطا رو میده:
وقتی Countinue میزنم برنامه از کار متوقف میشه و از حالت run خارج میشه:
اما وقتی ok رو میزنم این تصویر زیر رو میده:
نوشته اصلی توسط Master
برای اینکه بهتون ارور نده . شما میتونید از دوتا بیت مپ استفاده کنید . یعنی عکس رو اول بخونید تو یه متغییر بیت مپ دیگه و بعد از بیت مپ دوم استفاده کنید .
منظورتون اینه که کد رو به این طریق تغییرش بدم؟(اونجاهایی که علامت + گذاشتم رو تغییر دادم)
ویرایش توسط NIIT : 1st January 2012 در ساعت 10:52 PM
منظورتون اینه که کد رو به این طریق تغییرش بدم؟(اونجاهایی که علامت + گذاشتم رو تغییر دادم)
نه اونطوری نباید عمل کنید . کاری که شما کردید اینه که دوتا متغیر بیت مپ دارید که جفتشون دارن به یک نقطه از حافظه اشاره میکنن .
شما میتونید یکی از راه های زیر رو انجام بدید .
///rahe 1
image = Image.FromFile(openFileDialog1.FileName);
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
bitmap = new Bitmap(Image.FromStream(ms));
pictureBox1.Image = Image.FromStream(ms);
AlterImage(bitmap);
image.Dispose();
//rahe 2
//Bitmap tempbitmap = new Bitmap(openFileDialog1.FileName);
//bitmap = new Bitmap(tempbitmap);
//tempbitmap.Dispose();
//AlterImage(bitmap);
///rahe 3
//Bitmap tempbitmap = new Bitmap(openFileDialog1.FileName);
//bitmap = new Bitmap(tempbitmap.Width, tempbitmap.Height);
//Graphics graphics = Graphics.FromImage(bitmap);
//graphics.DrawImage(tempbitmap, new Rectangle(0, 0, tempbitmap.Width, tempbitmap.Height), 0, 0, tempbitmap.Width, tempbitmap.Height, GraphicsUnit.Pixel);
//graphics.Dispose();
//tempbitmap.Dispose();
//AlterImage(bitmap);
خود برنامه :
//in the name of GOD
//Loading an image to and Saving it from Bitmap and PictureBox
//How to solve GDI+ error (a generic error has occured in gdi+)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
namespace load_and_save_image
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}
نه اونطوری نباید عمل کنید . کاری که شما کردید اینه که دوتا متغیر بیت مپ دارید که جفتشون دارن به یک نقطه از حافظه اشاره میکنن .
شما میتونید یکی از راه های زیر رو انجام بدید .
آقای حسنپور واقعا ازتون بابت توضیحات مفیدتون ممنونم اما آقای حسنپور در قسمت Save به یک مشکلی برخوردم ، بنده سعی کردم دقییا اون چیزی رو که نوشتین دوباره خودم بنویسم اما یک قسمتی که شما استفاده کردین .....نمیاد ، در تصویر بیشتر براتون توضیح میدم ، به تصاویر نگاه بفرمایین:
در اینجا اون کدی که فرمودین رو نوشتم منتهی اون جاهایی که آبی رنگ کردمو ببینین:
حالا این کد خودتونه اون جایی که آبی رنگ کردمو ببینین:
از این تصاویر به بعد برنامه ای هست که اومدم با اون خطی که برنامه خودم بود و آبیش کردم براتون نمایش میدم:
اومدم در دکمه openم یک فرم دیگه گذاشتم که کار open , save در اونجا انجام بشه :
اینجا پوشه ای رو باز میکنم که تصویری رو بذارم:
و در آخر میام تصویر رو میندازم و میخوام برای save بعد از اینکه نام بهش دادم ذخیرش کنه اما هرچقدر دکمه save میزنم انجام نمیده:
save کار نمیکنه......باید چیکار کنم؟؟؟!!!
ویرایش توسط NIIT : 2nd January 2012 در ساعت 08:19 PM
من سرعت اینترنتم الان 2 کیلوبایت تا نهایتا 3 کیلوبایته این عکسا خیلی حجیم هستن و وسط راه دیگه لود نمیشه ! برای منم کامل مشخص نیستن .
اگه چیزی من نوشتم که شما براتون نمیاد نگاه به using های بالای فرم کنید . اون یوزینگ ها رو بنویسید .
بعد سورسکدهایی که نوشتید رو حداقل قرار بدید که من بتونم ببینم . یا حجم عکسارو بیارید پایین تر یا سورسها رو با توضیحاتتون قرار بدید من بدونم چی به چیه ( پروژه نه - سورسها رو مثل همین حالتی که من گذاشتم بزارید )
علاقه مندی ها (Bookmarks)