PDA

View Full Version : سوال: قرار دادن پيكسل رنگ درون يك آرايه دوبعدي



amir4015
یک شنبه 20 فروردین 1391, 14:37 عصر
سلام
من مي خواستم يك برنامه بنويسم كه زماني يك عكس وارد برنامه شد تمام شماره رنگ هايپيكسل هاي عكس رو وارد يك آرايه دو بعدي بكنم
اما زماني كه اين كار رو با يك فور انجام مي دم كه تمام پيكسل ها رو بشماره خيلي زمان مي بره مي خواستم ببينم راه سريع تري نيست

amir4015
یک شنبه 20 فروردین 1391, 14:58 عصر
من از اين كد استفاده مي كنم كه خيلي طول مي كشه


int[,] arraye1 = newint[pictureBox1.Size.Width, pictureBox1.Size.Height];
for (int a = 1; a < pictureBox1.Size.Width; a++)
{
for (int b = 1; b < pictureBox1.Size.Height; b++)
{
Bitmap pic = newBitmap(pictureBox1.Image, pictureBox1.Size.Width, pictureBox1.Size.Height);
arraye1[a, b] = pic.GetPixel(a, b).GetHashCode();
}
}

hakim22
یک شنبه 20 فروردین 1391, 15:05 عصر
برای اینکه تمام شماره رنگها رو توی آرایه بریزید راه همینه چون در هر صورت باید به تعداد پیکسل ها حلقه تکرار بشه و برای کوچکترین عکسها هم این کار خیلی زیادیه
اما اگر مشخص کنید هدف از ذخیره کردن اطلاعات عکس داخل آرایه چیه شاید راه بهتری بشه ارائه کرد !؟

amir4015
یک شنبه 20 فروردین 1391, 15:10 عصر
ممنون از جواب
من مي خوام دو تا عكس رو باهم مقايسه كنم و عكس دوم روي يك پيكسلم قرار داشته باشه و اگه فريم عوض شد مقدار جابجا شدن اون پيكسل رو تشخيص بده

amir4015
یک شنبه 20 فروردین 1391, 15:23 عصر
........................................

hakim22
یک شنبه 20 فروردین 1391, 15:39 عصر
در مورد عکسها و پردازش تصویر .net یکمی ضعیف عمل می کنه چون در حقیقت .net کد مدیریت شدست و برای اینکه سیستم هنگ نکنه مدیریت حافظه کار برنامه رو کند میکنه .
برای همین توابعی مثل GetPixel کارشون طول میکشه. شما باید محتویات عکس رو مستقیم بخونید. برای اینکار باید از تگی بخ نام Unsafe استفاده کنید.

یک قابلیت در Bitmap هست به نام LockBits که به شما اجازه میده بخشهایی از یک عکس رو در جای ثابتی درون حافظه ذخیره و بازیابی کنید.
سری به مقاله ی زیر بزنید :
http://www.bobpowell.net/lockingbits.htm

amir4015
یک شنبه 20 فروردین 1391, 15:46 عصر
من از سايت codeproject يك برنامه گرفتم
كه با unsafe كار مي كنه
اما زماني ميارم داخل برنامه خودم كار نمي كنه ارور مي گيره

amir4015
یک شنبه 20 فروردین 1391, 15:47 عصر
اين ارور رو مي ده
Unsafe code may only appear if compiling with /unsafe

amir4015
یک شنبه 20 فروردین 1391, 15:52 عصر
اين كلاس است
داخل برنامه خودش كار مي كنه اما در برنامه من ارور كه گفتم رو مي ده


public static bool Color(Bitmap b, int red, int green, int blue)
{
if (red < -255 || red > 255) return false;
if (green < -255 || green > 255) return false;
if (blue < -255 || blue > 255) return false;
// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
int nPixel;
for(int y=0;y<b.Height;++y)
{
for(int x=0; x < b.Width; ++x )
{
nPixel = p[2] + red;
nPixel = Math.Max(nPixel, 0);
p[2] = (byte)Math.Min(255, nPixel);
nPixel = p[1] + green;
nPixel = Math.Max(nPixel, 0);
p[1] = (byte)Math.Min(255, nPixel);
nPixel = p[0] + blue;
nPixel = Math.Max(nPixel, 0);
p[0] = (byte)Math.Min(255, nPixel);
p += 3;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}

hakim22
یک شنبه 20 فروردین 1391, 15:52 عصر
برید به قسمت Properties مربوط به پروژه و از تب Build گزینه ی Allow unsafe code v رو تیک بزنید.

amir4015
یک شنبه 20 فروردین 1391, 15:59 عصر
تشكر
اما سوال آخر
حالا چطور با توجه به كلاس بالا درون ارايه رنگ پيكسل ها رو قرار بدم
تا بتونم
دو تا عكس رو باهم مقايسه كنم و عكس دوم روي يك پيكسلم قرار داشته باشه و اگه فريم عوض شد مقدار جابجا شدن اون پيكسل رو تشخيص بده

amir4015
یک شنبه 20 فروردین 1391, 16:07 عصر
تشكر
اما سوال آخر
حالا با توجه به كلاس بالا چطور مي تونم پيكسل ها رو درون آرايه قرار بدم

amir4015
یک شنبه 20 فروردین 1391, 16:19 عصر
..............................................