لم أكتب شيئًا منذ فترة طويلة، ليس لأنني عانيت كثيرًا من الطماطم والبيض في مشاركاتي السابقة، ولكن لأنني حقًا لا أملك أي شيء حقيقي لأكتبه ليكون مرجعًا للجميع. لكن مؤخرًا عندما كنت أساعد صديقًا في مشروع ما، صادفت عملية بسيطة لمعالجة الصور في دلفي، لذلك واصلت البحث عن المعلومات على الإنترنت وتصفحت منشورات csdn السابقة، ووجدت الكثير من الأشخاص من خلال نتائج البحث الخاصة بي هل واجهت مشاكل مماثلة في معالجة الصور في مشاريع مختلفة، لكن معظم الإجابات التي حصلت عليها بدت غير مكتملة (لأن الكثير منها لم يكتمل، أو قد يكون الأمر مسألة عادات شخصية. هههه، أتمنى أن يتمكن الجميع من البدء في العمل عليها بعد ذلك) قراءة مقالتي سرعة الإغلاق). لذلك قمت بكتابة المشاكل والحلول التي واجهتها أدناه لتكون مرجعًا لك، وفي الوقت نفسه، نرحب بك لمواصلة صنع الطوب.
أريد أن أكتب المشكلة التي أريد حلها قبل المحتوى الرسمي، وفي الوقت نفسه، يمنح القراء أيضًا موضعًا جيدًا، حتى لا ينزعجوا من أساليبي الخرقاء في هذه العملية. المشكلة الرئيسية التي يجب حلها هنا هي تدوير الصورة الممسوحة ضوئيًا بالماسح الضوئي 90 درجة في دلفي للحصول على صورة مناسبة للاستخدام، ولأن حجم الصورة لا يمكن استيعابه بشكل صحيح، فإن الصورة تحتاج إلى تغيير حجمها ببساطة. والحل الخاص بي يعتمد بالكامل على هذا المطلب، لأنني لا أفكر كثيرًا في الكفاءة والوضوح بعد معالجة الصور، والفائدة هي أن البرنامج يبدو بسيطًا للغاية.
بادئ ذي بدء، ليس لدي ماسح ضوئي، لذلك لا أعرف ما هو تنسيق الصورة التي تم الحصول عليها باستخدام الماسح الضوئي (المتوفر بالفعل)، وفي مساعدة دلفي تقول "الصورة النقطية هي كائن رسومي قوي يستخدم لإنشاء والتعامل معها (قياسها، وتمريرها، وتدويرها، وطلاءها)، وتخزين الصور في الذاكرة وكملفات على قرص"، لذا فإن خطوتي الأولى هي تحويل الشرائح إلى TBitmap للمعالجة. أثناء تحويل التنسيق، قمت بتغيير الحجم الفعلي للصورة ليناسب احتياجات تحديد جزء من الصورة لاحقًا. الوظيفة هي كما يلي:
الإجراء TMainForm.ChangeImageFormate;
فار الصورة النقطية: TBitmap؛
التكبير/التصغير: عدد صحيح؛
يبدأ
الصورة النقطية := TBitmap.Create;//1
يحاول
مع ImageCert لا تبدأ
Bitmap.Assign(Picture.Graphic);//2
الصورة := لا شيء;//3
التكبير/التصغير := Max(Bitmap.Width div Width,Bitmap.Height div Height)+1;//4
Width := Bitmap.Width div Zoom;//5
الارتفاع := الصورة النقطية. الارتفاع div Zoom;//6
Canvas.StretchDraw(Rect(0,0,Width,Height),Bitmap);//7
نهاية؛
أخيراً
Bitmap.Free;
نهاية؛
نهاية؛
أعتقد أن هذا الكود ليس معقدًا للغاية. ImageCert عبارة عن عنصر تحكم TImage موضوع في النموذج. الشيء الوحيد الذي قد يكون غير مألوف هو الجملة الثامنة، لكن يمكنك الحصول على الكثير من التوضيحات من مساعدة دلفي (نصيحتي هي قراءة المزيد من المساعدة). في الوقت نفسه، تجدر الإشارة إلى أن الجملة الثالثة مهمة للغاية. إذا قمت بإزالة هذه الجملة ولم يكن تنسيق الصورة bmp، فسيظهر الخطأ "يمكن تعديل الصورة النقطية فقط".
الخطوة الثانية هي تحقيق تدوير الصورة، لأن البرنامج يتطلب دورانًا بمقدار 90 درجة فقط في كل مرة، لذلك يكون التعامل معه أسهل هنا. طريقة المعالجة هي الاستبدال حسب البكسل. عملية التنفيذ هي كما يلي:
الإجراء TMainForm.RotateImage;
فار x,y : عدد صحيح;
TmpBitMap : TBitmap;
يبدأ
TmpBitMap := TBitmap.Create;
يحاول
TmpBitMap.Assign(ImageCert.Picture.Graphic);
مع ImageCert لا تبدأ
Picture.Bitmap.Height := TmpBitMap.Width;
Picture.Bitmap.Width := TmpBitMap.Height;
من أجل x:=0 إلى الارتفاع افعل
لـ y:=0 إلى Width افعل
Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
الارتفاع := TmpBitMap.Width;
Width := TmpBitMap.Height;
نهاية؛
أخيراً
TmpBitMap.Free;
نهاية؛
نهاية؛
ليس هناك الكثير لنتحدث عنه في هذا البرنامج، لكن إعدادات الارتفاع والعرض المتعددة تجعلني أشعر بالانزعاج الشديد دائمًا، لكن لا يمكنني إزالة أي صفوف، إذا كان أي شخص مهتمًا، يمكنك المحاولة الآن، من الأفضل أن تخبرني بالنتائج. وفي هذه الحالة، نظرًا لأن TImage وTBitmap لهما لوحة قماشية خاصة بهما، فقد يكون من المفيد دراسة أي منها يجب استخدامه، ولكن نظرًا لضيق الوقت، لم أجربه.
بالنسبة لجزء من عملية التقاط الصور، استخدمت TShape، ثم قمت بتعيين نمط الفرشاة على bsclear، وقمت بترتيب موضع TShape في onMouseMove من ImageCert، وهذا ليس حساسًا للغاية، لأنه عندما يكون الماوس على TShape، فإنه سوف يفعل ذلك ليس لها أي تأثير، ولكن لحسن الحظ أن التأثير سيكون صغيرا. في الوقت نفسه، التقطت بعض الصور الموجودة أسفل TShape في حدث OnMouseDown الخاص بـ TShape. في هذا الوقت، إذا لم يتم تغيير حجم صورتك، فستجد أن الصورة التي تمت إزالتها لا تتطابق مع الموضع الذي نراه (بالطبع، عندما لا يعرض TImage حجم الصورة بشكل صحيح).