ฉันไม่ได้เขียนอะไรเป็นเวลานาน ไม่ใช่เพราะฉันต้องทนทุกข์ทรมานกับมะเขือเทศและไข่มากมายในโพสต์ก่อนหน้าของฉัน แต่เป็นเพราะฉันไม่มีอะไรจริง ๆ ที่จะเขียนเพื่อให้ทุกคนอ้างอิง แต่เมื่อไม่นานมานี้ ตอนที่ฉันช่วยเพื่อนทำโปรเจ็กต์ ฉันบังเอิญเจอกระบวนการง่ายๆ ในการประมวลผลภาพใน Delphi ดังนั้นฉันจึงค้นหาข้อมูลบนอินเทอร์เน็ตและดูโพสต์ csdn ก่อนหน้าของฉัน ฉันพบว่ามีคนจำนวนมาก คงจะเคยเจอปัญหาการประมวลผลภาพคล้ายๆ กันในโปรเจ็กต์ต่างๆ บ้าง แต่คำตอบส่วนใหญ่ดูเหมือนจะไม่สมบูรณ์ (เพราะหลาย ๆ ข้อยังไม่ได้โพสหรืออาจเป็นเรื่องของนิสัยส่วนตัว 555 หวังว่าหลังจากอ่านบทความนี้แล้ว ของผมทุกคนสามารถเริ่มทำงานที่บ้านได้เลย ดังนั้นฉันจึงเขียนปัญหาและแนวทางแก้ไขที่ฉันพบด้านล่างไว้เพื่อใช้อ้างอิง ในเวลาเดียวกัน คุณสามารถสร้างอิฐต่อไปได้
ฉันต้องเขียนปัญหาที่ฉันต้องการแก้ไขก่อนเนื้อหาที่เป็นทางการ และให้ผู้อ่านมีจุดยืนที่ดี เพื่อที่พวกเขาจะไม่ต้องกังวลกับการจัดการปัญหาที่ไม่ดีของฉัน ปัญหาหลักที่ต้องแก้ไขที่นี่คือการหมุนภาพที่สแกนด้วยสแกนเนอร์ 90 องศาใน Delphi เพื่อให้ได้ภาพที่เหมาะสมสำหรับการใช้งาน และเนื่องจากไม่สามารถจับขนาดของภาพได้อย่างถูกต้อง จึงจำเป็นต้องปรับขนาดภาพเพียงอย่างเดียว และโซลูชันของฉันเป็นไปตามข้อกำหนดนี้โดยสมบูรณ์ เนื่องจากฉันไม่ได้คิดมากเกี่ยวกับประสิทธิภาพและความคมชัดหลังจากการประมวลผลภาพ และข้อดีก็คือโปรแกรมดูเรียบง่ายมาก
ก่อนอื่น ฉันไม่มีสแกนเนอร์ ดังนั้นฉันจึงไม่รู้ว่ารูปภาพที่ได้รับจากการใช้สแกนเนอร์ (มีให้แล้ว) เป็นรูปแบบใด และในความช่วยเหลือของ Delphi มันบอกว่า "บิตแมปเป็นวัตถุกราฟิกที่ทรงพลังที่ใช้ในการสร้าง จัดการ (ปรับขนาด เลื่อน หมุน และระบายสี) และจัดเก็บภาพในหน่วยความจำและเป็นไฟล์บนดิสก์" ดังนั้นขั้นตอนแรกของฉันคือการแปลงสไลซ์ของฉันเป็น TBitmap เพื่อการประมวลผล ขณะแปลงรูปแบบ ฉันเปลี่ยนขนาดจริงของรูปภาพเพื่อให้เหมาะกับความต้องการในการเลือกส่วนของรูปภาพในภายหลัง ฟังก์ชั่นมีดังนี้:
ขั้นตอน TMainForm.ChangeImageFormate;
บิตแมป var : TBitmap;
ซูม: จำนวนเต็ม;
เริ่ม
บิตแมป := TBitmap.Create;//1
พยายาม
ด้วย ImageCert จะเริ่มต้น
Bitmap.Assign(รูปภาพ.กราฟิก);//2
รูปภาพ := ไม่มี;//3
ซูม := สูงสุด(ความกว้าง div บิตแมป ความกว้าง ความสูง div บิตแมป ความสูง)+1;//4
ความกว้าง := บิตแมป ความกว้าง div ซูม;//5
ความสูง := บิตแมป ความสูง div ซูม;//6
Canvas.StretchDraw (สี่เหลี่ยม (0,0, กว้าง, สูง), บิตแมป); // 7
จบ;
ในที่สุด
บิตแมปฟรี;
จบ;
จบ;
ฉันคิดว่าโค้ดนี้ไม่ซับซ้อนมาก ImageCert เป็นตัวควบคุม TImage ที่อยู่ในแบบฟอร์ม สิ่งเดียวที่อาจไม่คุ้นเคยคือประโยคที่แปด แต่คุณจะได้รับคำอธิบายมากมายจากความช่วยเหลือของ Delphi ฉันจะไม่แปลมันที่นี่ . (คำแนะนำของฉันคืออ่านความช่วยเหลือเพิ่มเติม) ในเวลาเดียวกัน ควรชี้ให้เห็นว่าประโยคที่สามมีความสำคัญมาก หากคุณลบประโยคนี้และรูปแบบรูปภาพของคุณไม่ใช่ bmp ข้อผิดพลาด "เฉพาะบิตแมปเท่านั้นที่สามารถแก้ไขได้" จะปรากฏขึ้น
ขั้นตอนที่สองคือการตระหนักถึงการหมุนของภาพ เนื่องจากโปรแกรมต้องการการหมุนเพียง 90 องศาในแต่ละครั้ง ดังนั้นจึงง่ายต่อการจัดการที่นี่ วิธีการประมวลผลคือการแทนที่ตามพิกเซล กระบวนการดำเนินการมีดังนี้:
ขั้นตอน TMainForm.RotateImage;
var x,y : จำนวนเต็ม;
TmpBitMap : TBitmap;
เริ่ม
TmpBitMap := TBitmap.Create;
พยายาม
TmpBitMap.Assign (ImageCert.Picture.Graphic);
ด้วย ImageCert จะเริ่มต้น
รูปภาพ.Bitmap.Height := TmpBitMap.Width;
รูปภาพ.Bitmap.Width := TmpBitMap.Height;
สำหรับ x:=0 ถึงความสูงทำ
สำหรับ y:=0 ถึงความกว้างทำ
Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
ความสูง := TmpBitMap.Width;
ความกว้าง := TmpBitMap.Height;
จบ;
ในที่สุด
TmpBitMap ฟรี;
จบ;
จบ;
โปรแกรมนี้ไม่มีอะไรจะพูดมากนัก แต่การตั้งค่าความสูงและความกว้างหลายอย่างทำให้ฉันรำคาญมาก ฉันมักจะรู้สึกว่าต้องทำอะไรมากกว่านี้ แต่ฉันไม่สามารถลบแถวใด ๆ ได้ ลองดูสิ คงจะดีที่สุดถ้าคุณบอกฉันผลลัพธ์ และในกรณีนี้ เนื่องจาก TImage และ TBitmap มีผืนผ้าใบของตัวเอง ซึ่งอันไหนน่าใช้อาจคุ้มค่าที่จะศึกษา แต่เนื่องจากมีเวลาจำกัด ฉันจึงยังไม่ได้ลองใช้
สำหรับส่วนหนึ่งของกระบวนการถ่ายภาพ ฉันใช้ TShape จากนั้นตั้งค่าสไตล์แปรงเป็น bsclear และจัดตำแหน่งของ TShape ใน onMouseMove ของ ImageCert ซึ่งไม่ละเอียดอ่อนมากนัก เพราะเมื่อเมาส์อยู่บน TShape มันจะไม่เป็นเช่นนั้น มีผลกระทบใดๆ แต่โชคดีที่ผลกระทบจะมีน้อย ในเวลาเดียวกัน ฉันถ่ายภาพบางส่วนภายใต้ TShape ในเหตุการณ์ OnMouseDown ของ TShape ในขณะนี้ หากรูปภาพของคุณไม่ได้ถูกปรับขนาด คุณจะพบว่ารูปภาพที่ถูกลบไม่ตรงกับตำแหน่งที่เราเห็น (แน่นอนว่า เมื่อ TImage แสดงขนาดรูปภาพไม่ถูกต้อง)