วิธีครอบตัดรูปภาพขนาดใหญ่

ฉันต้องประมวลผลภาพขนาดใหญ่ (20,000x20,000pixels) ใน C# การเปิดภาพเหล่านี้โดยตรงไม่ใช่วิธีที่จะดำเนินการได้เนื่องจากข้อจำกัดของหน่วยความจำ แต่สิ่งที่ฉันต้องการทำคือแบ่งภาพออกเป็นชิ้นเล็กๆ (การครอบตัด) ฉันกำลังมองหาห้องสมุดบุคคลที่สามที่สามารถหลอกลวงได้ แต่จนถึงขณะนี้ยังไม่มีผลลัพธ์ ฉันลองใช้ FreeImage และ ImageMagick แล้ว แต่ไม่สามารถเปิดภาพขนาด 20,000x20x000 พิกเซลได้ ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร?


person Community    schedule 19.06.2009    source แหล่งที่มา
comment
รูปภาพอยู่ในรูปแบบใด? ในรูปแบบเช่นบิตแมป คุณสามารถใช้ไฟล์ io ได้โดยตรง หากคุณต้องการใช้ GDI หรืออะไรก็ตาม คุณจะต้องแปลงแต่ละชิ้นเป็นสตรีมแล้วโหลดลงในรูปภาพ) รูปแบบเช่น PNG ต้องการให้คุณเจาะลึกมากขึ้น โดยตรวจสอบว่าไฟล์ PNG ถูกแบ่งออกเป็นบล็อกและทำงานกับไฟล์เหล่านั้นโดยตรงอย่างไร   -  person Brian    schedule 19.06.2009


คำตอบ (5)


โปรเจ็กต์ปัจจุบันของฉันในที่ทำงานประกอบด้วยโปรแกรมดู/วิเคราะห์รูปภาพที่สามารถโหลดรูปภาพเกิน 16 GB คุณต้องใช้ไฟล์ IO แบบกำหนดเอง ดึงข้อมูลส่วนหัวออกมาและสร้างภาพย่อยตามความต้องการ (หรือหากคุณกำลังประมวลผลภาพ คุณสามารถสร้างไทล์เดียวและประมวลผลแบบแทนที่ได้) มีไลบรารีเพียงไม่กี่แห่งที่ให้ความสามารถในการโหลด/แก้ไขรูปภาพขนาด 20k คูณ 20k (1.2gb ที่ 24bpp) และไลบรารีที่ทำเช่นนั้นจะไม่ค่อยทำเช่นนั้นกับประสิทธิภาพที่คล้ายคลึงกัน (หากเป็นปัญหา)

person Ron Warholic    schedule 19.06.2009
comment
ภาพขนาด 16GB+? เจ๋งมาก พวกมันมาจากไหน? - person Allen Rice; 19.06.2009
comment
เราทำงานร่วมกับภาพเรดาร์รูรับแสงสังเคราะห์ซึ่งสามารถสร้างภาพขนาดใหญ่มาก :P - person Ron Warholic; 19.06.2009
comment
ฮ่าๆ แย่จังเลย (Google มีรูปภาพสวยๆ อยู่ในนั้น) คุณใช้ภาษาอะไร ฉันสงสัยว่า C # สามารถจัดการภาระงานประเภทนั้นได้หรือไม่ - person Allen Rice; 19.06.2009
comment
เราใช้ C# เพื่อแสดงทุกอย่าง และเรา P/เรียกใช้ C++ ด้วย OpenGL เพื่อทำงานหนัก มันทำงานได้ดีอย่างน่าประหลาดใจ :P - person Ron Warholic; 19.06.2009

ไม่รู้ว่าจะช่วยได้หรือไม่ แต่นี่คือบทความเกี่ยวกับ การประมวลผลภาพด้วยนิพจน์ C# lambda

person jjclarkson    schedule 19.06.2009

ฉันไม่รู้ว่ามีห้องสมุดใดที่มีอยู่ให้ทำสิ่งนี้

คุณอาจต้องแคร็กเปิดสตรีมไฟล์รูปภาพ ค้นหาตำแหน่งที่มีข้อมูลสีและพิกเซล และอ่านส่วนหนึ่งของข้อมูลพิกเซลลงในอาร์เรย์ และสร้างรูปภาพของคุณจากสิ่งนั้น

ตัวอย่างเช่น สำหรับ รูปแบบไฟล์ BMP คุณจะต้องค้นหาในตารางสี โหลด ตารางสี จากนั้นค้นหาส่วนอาร์เรย์พิกเซล โหลดพิกเซลจำนวนเท่าใดก็ได้ที่คุณต้องการลงในอาร์เรย์ จากนั้นสร้างบิตแมปใหม่ด้วยพิกเซลเหล่านั้น

person Judah Gabriel Himango    schedule 05.12.2012

ฉันจะทำมันด้วย ImageMagick มี .NET API ที่ค่อนข้างแข็งแกร่ง และโดยทั่วไปแล้วจะเป็นวิธีที่ดีที่สุดในการประมวลผลภาพเช่นนี้

ดูที่ .NET ซึ่งเป็นส่วนหนึ่งของหน้าเพจ

http://www.imagemagick.org/script/api.php

นี่คือข้อมูลเกี่ยวกับวิธีการทำงานของการครอบตัดใน ImageMagick สำหรับเวอร์ชันบรรทัดคำสั่ง

http://www.imagemagick.org/Usage/crop/#crop

person Matthew Kennedy    schedule 06.12.2012

คุณสามารถใช้ไลบรารี .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 อาจเป็นขนาดทั้งหมดของเอาท์พุตอิมเมจหรือพื้นที่ที่เล็กกว่า

person Todd    schedule 22.11.2017