الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما الخطأ في الكود؟؟؟

بدأه شمعة الأمل في 9 مايو 2008 · 15 رد · 1,461 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

أحاول عمل برنامج يقوم بدمج صورتين مع بعض عن طريق السي++ وقد كتبت الكود التالي بحيث ينسخ إحدى الصورتين إلى ملف جديد ومن ثم يقوم البرنامج بإدخال الصورة الأخرى عليها والهدف من نسخة الصورة الأولى هو الاحتفاظ بالنسخة الأصلية للعمل عليها فيما بعد

مايحدث الآن أن البرنامج لايعطي أي نتيجة مع انه من المفترض أن يصبح لدي صورة جديد عبارة عن صورتين مع بعض

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

int main()

{

int BackGround[300][400];

int mask[175][150];

int maskBG[300][400];

ifstream infileBackGround;

ifstream infileMask;

infileBackGround.open("BG.pgm");

infileMask.open("mask.pgm");

ofstream outfileMaskBG;

outfileMaskBG.open("maskBG.pgm");

for(int i=0; i<300; i++)

for(int j=0; j<400; j++)

{

infileBackGround>>BackGround[j];

maskBG[j]= BackGround[j];

outfileMaskBG<<maskBG[j]<<" ";

}

for(int x=0; x<300; x++)

for(int y=0; y<400; y++)

{

if(x== 125 && y== 250)

{

infileMask>>mask[x][y];

if(mask[x][y]== 255)

maskBG[x][y]= maskBG[x][y];

else

maskBG[x][y]= mask[x][y];

}

outfileMaskBG<<maskBG[x][y]<<" ";

}

return 0;

}

#2

اهلين اختي

اتركي الدمج بين الصورتين الان , جربي ان تنقلي الصورة a إلى b هل هذه الطريقة ستنفع ؟

للتوضيح اكثر , لاحظي حجم كل من الصورة الاساسية والصورة المنقولة .

ايضا استخدمي الحجز الديناميكي للمصفوفات ,

ايضا سؤال , نحن نستخدم ios::trunc ام ios::binary للتعامل مع الصور؟

تم تعديل هذه المشاركة بواسطة time1 في 10 مايو 2008 في 12:41

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

جزيت خيرا أخي على ردك

هل تقصد أن أقوم بالنسخ أولا بدون الدمج؟ ... إن كان هذا ماتقصده فقد قمت به من قبل وتم النسخ بنفس الحجم للصورتين

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

:rolleyes:

#4

نعم اقصد النسخ عن طريق انشاء صورة b في مكان ما ووضع كل بيانات الصورة a فيها , لتنتج لنا صورة b عبارة عن نسخة من a اذا قمتي بهذا فعلا فسيكون العمل جدا سهل . ! !

اقصد بالحجز الديناميكي , حجز مصفوفات ثنائية الابعاد ولكن ديناميكية new .

اما السؤال الاخير فجوابه : ios::binary

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#5

جزيت خيرا أخي

عملية النسخ تمت بنجاح ولامشكلة في ذلك لكن الدمج لايتم ولاتظهر أي نتيجة

#6

ماذا تقصد بالدمج؟ وضع صورة بجانب صورة؟ أم فوق بعض مع شفافية، أم ماذا؟

#7

أعتقد أن الخطأ فى جزء وضع ال foreground (ال mask كما سميتيه) على ال background, و هو أنك يجب تحديد منطقة داخل ال background لإستبدال القيم داخلها بالقيم الموجودة فى ال mask. يعنى مثلا لو ال BG عبارة عن مصفوفة بالحجم 300*400 كما إفترضتى, و ال mask بالحجم 200*200, إذا يجب إختيار 200*200 نقطة داخل ال BG لإستبدالهم بقيم ال pixels داخل mask, مثلا سنختار النقط الموجودة فى مركز ال BG, من x=50 to x=250 و من y=100 to y=300. و بذلك ستكون النقطة (0,0) فى ال mask موجودة عند النقطة (50,100) فى ال BG, يعنى كأننا نقلنا كل إحداثيات ال mask بهذا المقدار بالظبط. لذلك أتوقع أن تكون لووب الإستبدال كالتالى

int mask_off_x = 50;
int mask_off_y = 100;

for(int x=0; x<200; x++)
  for(int y=0; y<200; y++)
  {
	  infileMask>>mask[x][y];   //you don't really need to store the mask into a matrix but whatever.
	  if(mask[x][y] != 255)
	  maskBG[x+mask_off_x][y+mask_off_y]= mask[x][y];
  }

// display output
for(int i=0; i<300; i++)
  for(int j=0; j<400; j++)
	 outfileMaskBG<<maskBG[x][y]<<" ";

و كمان فى حاجة, أعتقد إنك مش بتتعاملى مع ال PGM format بطريقة صحيحة! ولا إنتى قاصدة دا؟

تم تعديل هذه المشاركة بواسطة Blueteeth في 10 مايو 2008 في 22:11

#8

أخي إسماعيل ابراهيم جزيت خيرا على ردك

أقصد بالدمج وضع صورة على أخرى ولكن ليس بشفافية بمعنى أن تستبدل نقاط صورة الخلفية بنقاط الصورة الأخرة المدموجة عليها

أخي Blueteeth بارك الله فيك

ربما الخطأ في تحديد النقاط كما ذكرت ... سأجرب اليوم الطريقة التي ذكرتها ولكن على أي أساس أحدد مكان النقاط؟

أما بالنسبة للصور بصيغة الـpgm

فأنا استعمل برنامج لتحويل الصور من أي صيغة إلى صيغة المذكورة ومن ثم أتعامل معها كمصفوفة وذلك من خلال القراءة من ملف بشكل عادي

#9

السلام عليكم,

تحددى مكان النقط على حسب المكان اللى عايزة تحطى فيه ال mask على ال BG, يعنى أنا إخترت الإحداثيات دى علشان ال mask يبقى موجود فى center الشكل بالضبط, إرسميها أحسن حتعرفى إزاى.

أنا كان قصدى إن صيغة ال PGM تحتوى قبل المصفوفة على كذا رقم كدة يمثلوا طول و عرض الصورة و ال maximum gray اللى هو بيعبر عن اللون الأبيض و كمان ال signature للصيغة دى, و بعدين بعد دول كلهم تيجى المصفوفة > http://netpbm.sourceforge.net/doc/pgm.html

#10

وعليكم السلام

أخي Blueteeth جزيت خيرا

قمت بتجربة ما اقترحته علي وتم الدمج ولكن بدون نسخ الصورة الأصلية

حاولت من خلال الكود التالي لتتم عملية النسخ ولكن لم تظهر أي نتيجة

فماهو الحل؟


#include <fstream>
#include <string
int main()
{


char p2[10];
char comment[100];
int rows=262;
int cols=800;
int max = 255;


int tree[626][800];
//int mask[66][60];
int maskBG[626][800];
ifstream infileBackGround;
ifstream infileMask;
infileBackGround.open("tree.pgm");
infileMask.open("mask.pgm");

ofstream outfileMaskBG;
outfileMaskBG.open("maskBG.pgm");
infileBackGround.getline(p2, 10, '\n');
infileBackGround.getline(comment, 100, '\n');
infileBackGround>>rows>>cols;
infileBackGround>> max;
outfileMaskBG<<"P2"<<" # Created by IrfanView"<<rows <<" "<<cols<<max<<" ";
for(int i=0; i<626; i++)
for(int j=0; j<800; j++)
{
infileBackGround>>tree[j];
maskBG[j]= tree[j];
outfileMaskBG<<maskBG[j]<<" ";
}
return 0;
}
#include <iostream>

تم تعديل هذه المشاركة بواسطة شمعة الأمل في 12 مايو 2008 في 12:54

#12

جزيت خيرا أخي لاهتمامك

سأضع الصورتين اللي أستعملهما

الصورة الأولى هي التي أضعها كخلفية لكن بعد تحويلها إلى صيغة pgm وتكبير حجمها

والثانية أيضا بنفس الطريقة مع تصغير الحجم

الخلفية

المراد دمجها

#14

بإمكانك استعمال برنامج IrfanView لتحويل الصور وكذلك لتغيير الحجم

لتغيير حجم الصورة

image->Resize/Resample

لحفظ الصورة

file->save as->Ascii encoding->save as type pgm

#15

السلام عليكم,

بالنسبة لكودك يا أختى بصراحة أنا جربته و عدلت فيه بس برضه مش عايز يظبط, أعتقد إن فيه خطأ مستخبى هنا أو هنا و أنا مش شايفه.

الكود بعد التعديل >

int main()
{
	char p2[10];
	char comment[100];
	int rows=262;
	int cols=800;
	int max = 255;


	int tree[300][383];
	int mask[66][60];
	int maskBG[300][383];
	ifstream infileBackGround;
	ifstream infileMask;
	infileBackGround.open("tree.pgm");
	infileMask.open("mask.pgm");

	ofstream outfileMaskBG;
	outfileMaskBG.open("maskBG.pgm");
	infileBackGround.getline(p2, 10, '\n');
	infileBackGround.getline(comment, 100, '\n');
	infileBackGround>>cols>>rows;
	infileBackGround>> max;
	outfileMaskBG<<"P2"<<" # Created by IrfanView\n"<<cols<<" "<< rows << endl <<max<<"\n";
	for(int i=0; i<300; i++){
	  for(int j=0; j<383; j++)
	  {
	   infileBackGround>>tree[j];
	   maskBG[j]= tree[j];
	   outfileMaskBG<<maskBG[j]<<" ";
	  }
	}

	int mask_pixel;
	int row_off = 300/2 - 100/2;
	int col_off = 383/2 - 111/2;
	infileMask.getline(comment, 100, '\n');
	infileMask>>cols>>rows;
	infileMask>>max;
	int mask[100][111];
	for(int i=0; i<100; i++){
	  for(int j=0; j<111; j++)
	  {
	   infileMask>>mask[j];
	   if (mask[j] != 255)
		   maskBG[ i+row_off ][ j+col_off ] = mask[j];
	  }
	}

	for(int i=0; i<300; i++){
		for(int j=0; j<383; j++){
			outfileMaskBG<<maskBG[j]<<" ";
		}
	  outfileMaskBG << endl;
	}

	infileBackGround.close();
	infileMask.close();
	outfileMaskBG.close();
	return 0;
}

فكتبت الكود دا من أول و جديد فظبط معايا الحمد لله >

int main(){
	ifstream bg("tree.pgm");
	ifstream fg("mask.pgm");
	ofstream comb("maskBG.pgm");

	unsigned short rows, cols, max_gray;
	char comment[100];
	bg.getline(comment, 100);
	bg >> cols >> rows >> max_gray;

	unsigned short comb_pixel;
	unsigned short fg_rows, fg_cols, fg_max_gray;

	comb << comment << endl;
	comb << cols << ' ' << rows << endl << max_gray << endl;

	fg.getline(comment, 100);
	fg >> fg_cols >> fg_rows >> fg_max_gray;

	unsigned short dummy;
	unsigned short row_off = rows/2 - fg_rows/2;
	unsigned short col_off = cols/2 - fg_cols/2;

	for(int i=0; i<rows; i++){
		for (int j=0; j<cols; j++){
			if (i>=row_off && i<row_off+fg_rows && j>=col_off && j<col_off+fg_cols){
				fg >> comb_pixel;
				if (comb_pixel == fg_max_gray)
					bg >> comb_pixel;
				else
					bg >> dummy; //to advance the cursor
			}
			else{
				bg >> comb_pixel;
			}
			comb << comb_pixel << ' ';
		}
		comb << endl;
	}

	return 0;
}

ملاحظة مهمة: الملفات الناتجة تبدأ ب P2#, يوجد حرف '\n' مختفى ما بين ال 2 & #, أنا مسحته الأول قبل ما أشغل البرنامج ب backspace أو delete عادى من ال كيبورد. يا كدة يا إما حتضطرى تعملى getline لل P2 لوحدها و getline تانية ل # Created ......, و بعد كدة تقرى الأعمدة و الصفوف عادى.

أنصحك برضه إنك متسبيش كودك غير لما تعرفى الغلط فين و تصححيه.

بالتوفيق إن شاء الله.

تم تعديل هذه المشاركة بواسطة Blueteeth في 14 مايو 2008 في 11:56

#16

جزاك الله خيرا أخي Blueteeth وبارك فيك وفتح عليك في الدنيا ولآخرة

الكود الذي كتبته قام بعمله أخيرا ولكن بعد ضبط أبعاد الصور الواحدة بحيث تكون متساوية

مثلا 200*200 أو أي قيم أخرى المهم أن تكون متساوية وتم تسليمه بالأمس قبل أن أرى ماكتبته فجزيت خيرا

ومع ذلك سأجرب الكود الذي كتبته وأستفيد منه

المشرف الفاضل Ala2 VB

بإمكانك التعديل بحسب ماتراه مناسبا

مواضيع مشابهة