ฉันต้องประมวลผลภาพขนาดใหญ่ (20,000x20,000pixels) ใน C# การเปิดภาพเหล่านี้โดยตรงไม่ใช่วิธีที่จะดำเนินการได้เนื่องจากข้อจำกัดของหน่วยความจำ แต่สิ่งที่ฉันต้องการทำคือแบ่งภาพออกเป็นชิ้นเล็กๆ (การครอบตัด) ฉันกำลังมองหาห้องสมุดบุคคลที่สามที่สามารถหลอกลวงได้ แต่จนถึงขณะนี้ยังไม่มีผลลัพธ์ ฉันลองใช้ FreeImage และ ImageMagick แล้ว แต่ไม่สามารถเปิดภาพขนาด 20,000x20x000 พิกเซลได้ ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร?
วิธีครอบตัดรูปภาพขนาดใหญ่
คำตอบ (5)
โปรเจ็กต์ปัจจุบันของฉันในที่ทำงานประกอบด้วยโปรแกรมดู/วิเคราะห์รูปภาพที่สามารถโหลดรูปภาพเกิน 16 GB คุณต้องใช้ไฟล์ IO แบบกำหนดเอง ดึงข้อมูลส่วนหัวออกมาและสร้างภาพย่อยตามความต้องการ (หรือหากคุณกำลังประมวลผลภาพ คุณสามารถสร้างไทล์เดียวและประมวลผลแบบแทนที่ได้) มีไลบรารีเพียงไม่กี่แห่งที่ให้ความสามารถในการโหลด/แก้ไขรูปภาพขนาด 20k คูณ 20k (1.2gb ที่ 24bpp) และไลบรารีที่ทำเช่นนั้นจะไม่ค่อยทำเช่นนั้นกับประสิทธิภาพที่คล้ายคลึงกัน (หากเป็นปัญหา)
ไม่รู้ว่าจะช่วยได้หรือไม่ แต่นี่คือบทความเกี่ยวกับ การประมวลผลภาพด้วยนิพจน์ C# lambda
ฉันไม่รู้ว่ามีห้องสมุดใดที่มีอยู่ให้ทำสิ่งนี้
คุณอาจต้องแคร็กเปิดสตรีมไฟล์รูปภาพ ค้นหาตำแหน่งที่มีข้อมูลสีและพิกเซล และอ่านส่วนหนึ่งของข้อมูลพิกเซลลงในอาร์เรย์ และสร้างรูปภาพของคุณจากสิ่งนั้น
ตัวอย่างเช่น สำหรับ รูปแบบไฟล์ BMP คุณจะต้องค้นหาในตารางสี โหลด ตารางสี จากนั้นค้นหาส่วนอาร์เรย์พิกเซล โหลดพิกเซลจำนวนเท่าใดก็ได้ที่คุณต้องการลงในอาร์เรย์ จากนั้นสร้างบิตแมปใหม่ด้วยพิกเซลเหล่านั้น
ฉันจะทำมันด้วย ImageMagick มี .NET API ที่ค่อนข้างแข็งแกร่ง และโดยทั่วไปแล้วจะเป็นวิธีที่ดีที่สุดในการประมวลผลภาพเช่นนี้
ดูที่ .NET ซึ่งเป็นส่วนหนึ่งของหน้าเพจ
http://www.imagemagick.org/script/api.php
นี่คือข้อมูลเกี่ยวกับวิธีการทำงานของการครอบตัดใน ImageMagick สำหรับเวอร์ชันบรรทัดคำสั่ง
http://www.imagemagick.org/Usage/crop/#crop
คุณสามารถใช้ไลบรารี .Net ในตัวได้
ใช้
sourceBitmap = (Bitmap)Image.FromStream(sourceFileStream, false, false);
ซึ่งจะหยุดข้อมูลภาพไม่ให้ถูกแคชไว้ในหน่วยความจำ คุณสามารถสร้างบิตแมปปลายทางใหม่เพื่อวาดส่วนย่อยของรูปภาพขนาดใหญ่นั้นไปที่:
var output = new Bitmap(outputWidth, outputHeight);
var outputGraphics = Graphics.FromImage(output);
outputGraphics.DrawImage(sourceBitmap, destRect, srcRect, GraphicsUnit.Pixel);
using (var fs = File.OpenWrite(outputFilePath))
{
output.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
}
โดยที่ destRect อาจเป็นขนาดทั้งหมดของเอาท์พุตอิมเมจหรือพื้นที่ที่เล็กกว่า