กล้องบล็อก 3D
BlockCam เป็นโปรแกรมกล้องสำหรับ iOS และ iPados ที่ถ่ายภาพผ่าน Avfoundation จากนั้นแปลงภาพเหล่านั้นให้เป็นฉาก 3 มิติที่เรียบง่าย ฉากอาจหมุนและปรับขนาดโดยผู้ใช้และบันทึกเป็นภาพแบน
Blockcam เขียนโดย Stuart Rankin
การกำหนดเวอร์ชันสำหรับ blockcam จะถูกเก็บรักษาไว้ในไฟล์ Versioning.swift และได้รับการอัปเดตโดยอัตโนมัติด้วยการสร้างแต่ละครั้งเป็นขั้นตอนสคริปต์ล่วงหน้า การอัปเดตรวมถึงการสร้าง IDs หมายเลขสร้างเวลาและวันที่ แต่หมายเลขเวอร์ชันจะต้องได้รับการอัปเดตด้วยมือในปัจจุบัน สตริงการสร้างปัจจุบันด้านล่างยังคงอยู่ด้วยกลไกเดียวกัน
โปรแกรมการใช้เวอร์ชันไม่ได้อัปเดตหมายเลขเวอร์ชันของไฟล์ Project Project
บิลด์ล่าสุด: เวอร์ชัน 0.9 อัลฟ่า, สร้าง 3287, วันที่สร้าง: 13 กรกฎาคม 2021, 16:06
ดูที่เก็บของ VersionUpDater บน GitHub สำหรับข้อมูลเกี่ยวกับวิธีการอัปเดตเวอร์ชันและการสร้าง
BlockCam ได้รับการออกแบบให้มีข้อมูลที่ผู้ใช้จัดหาให้มากที่สุด เมื่อใดก็ตามที่มีการใช้ข้อมูลที่ผู้ใช้สามารถระบุได้บล็อก CAM จะขอได้อย่างชัดเจน โดยการออกแบบ blockcam ไม่ได้รวบรวม ข้อมูล ที่ผู้ใช้สามารถระบุได้โดยค่าเริ่มต้น; ผู้ใช้ จะต้อง ดำเนินการตามขั้นตอนเพื่ออนุญาตการรวบรวมข้อมูลประเภทนี้
| ข้อมูลที่สามารถระบุได้ | ใช้ | พื้นที่จัดเก็บ |
|---|---|---|
| ชื่อผู้ใช้ | ชื่อผู้ใช้ (ป้อนโดยผู้ใช้) ที่จะเก็บไว้ในข้อมูลเมตาของภาพที่ผ่านการประมวลผล | เก็บไว้ใน UserDefaults |
| ลิขสิทธิ์ของผู้ใช้ | สตริงลิขสิทธิ์ของผู้ใช้ (ป้อนโดยผู้ใช้) ที่จะเก็บไว้ในข้อมูลเมตาของภาพที่ผ่านการประมวลผล | เก็บไว้ใน UserDefaults |
เมื่อผู้ใช้อินสแตนซ์ blockcam จะเปิดในโหมด Live View (แสดงมุมมองของกล้องบนหน้าจอหลัก) ผู้ใช้มีตัวเลือกในการเลือกหนึ่งในสามโหมด:
blockcam ได้รับการทดสอบบนแพลตฟอร์มต่อไปนี้:
UIBezierPath เพื่อเพิ่มรูปร่างมากขึ้นมีสี่ข้อกังวลเกี่ยวกับประสิทธิภาพสำหรับ blockcam:
autoreleasepool ความกังวลส่วนใหญ่ได้รับการแก้ไขแล้ว หากปรากฎว่าสิ่งนี้ไม่เพียงพอแผนการบรรเทาผลกระทบมีอยู่: บันทึกภาพรอยขีดข่วนทั้งหมดไปยังที่เก็บข้อมูลในท้องถิ่นจากนั้นอ่านโดยลำพังและประมวลผลทีละครั้ง สิ่งนี้จะทำให้สิ่งต่าง ๆ ช้าลง แต่ลดแรงดันหน่วยความจำ blockcam แปลงแต่ละภาพที่ถ่ายเป็นภาพพิกเซลผ่าน cipixellate CIPixellate กรอง coreImage หลังจากพิกเซลอัลกอริทึมการประมวลผลจะคำนวณความสูงที่กำหนด - ความสูงจะกำหนดขนาดของโหนดหรือการอัดขึ้นรูปของโหนด จากนั้นแต่ละพิกเซลจากภาพพิกเซลจะถูกแปลงเป็นรูปร่าง 3D (ตั้งค่าโดยผู้ใช้) จากนั้นเพิ่มเข้าไปในฉากปัจจุบันในมุมมอง 3D
การดำเนินการประมวลผลทั้งหมดใช้ประโยชน์จากรหัสเดียวกัน แต่อาจเรียกว่าแตกต่างกัน (หรือหลายครั้ง) ขึ้นอยู่กับโหมดผู้ใช้ที่ต้องเผชิญกับผล
ภาพได้มาสำหรับการประมวลผล แหล่งที่มาของภาพไม่สำคัญตราบใดที่เป็นมาตรฐานภาพที่อ่านได้ iOS/iPados แหล่งที่มาที่พบมากที่สุดของภาพมักจะเป็นกล้อง Live View แหล่งข้อมูลอื่น ๆ คืออัลบั้มภาพถ่ายและเฟรมวิดีโอ
ภาพต่อไปนี้เป็นแหล่งที่มาสำหรับการประมวลผล (นี่คือภาพที่ฉันถ่ายจากสวนของเราในช่วงต้นฤดูหนาว)

ด้วยค่าใช้จ่ายด้านประสิทธิภาพของการแปลงภาพผู้ใช้มีตัวเลือกในการลดปริมาณงานที่ทำโดยให้ภาพต้นฉบับขนาดเล็กลง สิ่งนี้อาจเกิดขึ้นได้หากไม่มีการแทรกแซงของผู้ใช้ควรประมวลผลวิดีโอ (การประมวลผลวิดีโอมีแนวโน้มที่จะใช้หน่วยความจำจำนวนมากดังนั้นแม้การบันทึกเพียงไม่กี่เปอร์เซ็นต์ต่อภาพจะช่วยให้สิ่งต่าง ๆ เครียดน้อยลงในระบบ) ภาพบางภาพก็หมุนไปที่ 270 ° (หรือ -90 °หากคุณต้องการ) และจำเป็นต้องหมุนอย่างถูกต้อง สิ่งนี้ยังทำในขั้นตอนการปรับสภาพภาพ
ภาพที่ประมวลผลจะถูกส่งผ่านฟังก์ชั่นตัวกรองภาพหลัก โดยเฉพาะการใช้ตัวกรองที่ใช้กันทั่วไปที่สุดคือ CIPixellate (แม้ว่าตัวกรองพิกเซลอื่น ๆ จะถูกใช้ขึ้นอยู่กับรูปร่างสุดท้าย) ขนาดของแต่ละภูมิภาคพิกเซลขึ้นอยู่กับการตั้งค่าผู้ใช้ ขนาดที่เล็กลงยิ่งส่งผลกระทบต่อประสิทธิภาพโดยรวมมากขึ้นแม้ว่า CIPixellate (และชอบตัวกรอง) จะยังคงเร็วมาก เหตุผลที่ภูมิภาคพิกเซลขนาดเล็กเพิ่มประสิทธิภาพเป็นเพราะต้องใช้โหนด 3D เพิ่มเติมในภายหลัง
ภาพต่อไปนี้แสดงพิกเซลของภาพต้นฉบับ โปรดทราบว่าแต่ละพื้นที่พิกเซลเป็นสีทึบซึ่งหมายความว่าบล็อกแคมไม่จำเป็นต้องอ่านทั้งภูมิภาคเพื่อให้ได้สี - เพียงหนึ่งพิกเซล

ภาพพิกเซลจะถูกแยกวิเคราะห์ สิ่งนี้เกี่ยวข้องกับการได้รับสีของแต่ละภูมิภาคพิกเซล นี่คือขั้นตอนที่ช้ากว่าที่คาดไว้ การรับข้อมูลพิกเซลแต่ละตัวจากภาพต้องใช้การจัดการข้อมูลภาพจำนวนมากเพียงเพื่อให้ภาพพร้อมที่จะสอบถาม ในตอนท้ายของขั้นตอนนี้ภาพจะไม่ถูกใช้อีกต่อไป ข้อมูลสี 2 มิติจะถูกส่งผ่านไปยังขั้นตอนต่อไป
ในขั้นตอนนี้ข้อมูลรูปภาพ Pixellated จะถูกบันทึกลงในที่เก็บไฟล์ในท้องถิ่น นี่คือการทำให้การเปลี่ยนแปลงภาพเล็กน้อยง่ายขึ้นในภายหลังโดยผู้ใช้
รูปร่างโหนดสุดท้ายคือการตั้งค่าผู้ใช้ blockcam ช่วยให้ผู้ใช้สามารถเลือกจากหนึ่งในหลายรูปร่าง-รูปร่างในตัวมีแนวโน้มที่จะทำงานได้เร็วกว่ารูปร่างที่ไม่ได้สร้าง (ตัวอย่างเช่นทรงกลมเร็วกว่า pentagons) โหนด 3D ถูกสร้างขึ้นสำหรับแต่ละสีจากขั้นตอนการแยกวิเคราะห์ภาพโดยใช้เรขาคณิตที่ระบุ เพื่อที่จะแสดง 3d-ness ของฉากสุดท้ายโหนดจะเกินจริงในบางมิติ ตัวอย่างเช่นหากลูกบาศก์เป็นรูปร่างที่ผู้ใช้เลือกความยาวจะเกินจริง การพูดเกินจริงจะถูกกำหนดโดยสี - สีที่ใช้ในการแรเงาพื้นผิวกระจายของโหนดเช่นเดียวกับการกำหนดความสูง การพูดเกินจริงถูกกำหนดโดยปัจจัยที่ผู้ใช้เลือกได้:
เมื่อมีการสร้างโหนดแล้วจะถูกเพิ่มลงในโหนดหลัก เมื่อโหนดทั้งหมดถูกสร้างและวางลงในโหนดหลักโหนดหลักจะถูกวางไว้ในฉาก 3D
ในขณะที่นี่อาจดูเหมือนเป็นขั้นตอนเล็กน้อย แต่มันก็ยุ่งยากมากเมื่อแปลงวิดีโอ หากการแปลงภาพสิ่งที่เกิดขึ้นคือฉาก 3 มิติจะได้รับการปรับปรุงและในที่สุดก็แสดงให้ผู้ใช้ (โดยปกติจะอยู่ภายใน 0.5 ถึง 2.0 วินาที) สำหรับวิดีโอเป็นสิ่งสำคัญที่จะต้องใช้เวลาของจอแสดงผลที่ถูกต้อง: ในการแปลงวิดีโอแต่ละเฟรมจะผ่านขั้นตอนเหล่านี้แล้วถ่ายภาพรวมของฉาก 3 มิติ หากถ่ายภาพสแน็ปช็อตก่อนที่ฉากจะปรากฏขึ้นผลลัพธ์จะเป็นภาพสีดำบริสุทธิ์ซึ่งไม่ใช่สิ่งที่ผู้ใช้ต้องการเห็น ดังนั้น blockcam จะต้องมีส่วนร่วมในชุดฟังก์ชัน SCNSceneRendererDelegate ที่จะรู้ว่าเมื่อใดที่ผู้ใช้สามารถมองเห็นฉากได้จริง
ภาพต่อไปนี้เป็นภาพสุดท้ายที่ประมวลผลของภาพ นี่คือผลลัพธ์ของการเรียก snapshot() บน SCNView ตัวอย่างใช้บล็อกที่อัดขึ้นรูปและถูกดูในการวางแนวกล้องเริ่มต้น

เมื่อภาพแสดงขึ้นผู้ใช้จะมีตัวเลือกในการบันทึกตามที่เป็นอยู่หรือแก้ไขแง่มุมของภาพหรือหมุนหรือซูมเข้าหรือออกจากนั้นบันทึกไว้ (อีกครั้งบางที) สำหรับวิดีโอเมื่อภาพรวมของฉาก 3 มิติถูกจับฉากจะถูกกำจัด
ขึ้นอยู่กับค่าของ .SaveOriginalImageAction ภาพต้นฉบับจะถูกบันทึกไว้ เมื่อผู้ใช้บันทึกภาพที่ประมวลผลข้อมูลเมตาจะถูกบันทึกพร้อมกับภาพที่ประมวลผล ข้อมูลเมตาประกอบด้วยชื่อและเวอร์ชันของโปรแกรมรวมถึงพารามิเตอร์ที่มีผลเมื่อสร้างภาพ
การบันทึกไฟล์ที่ประมวลผลเป็นกระบวนการหลายขั้นตอน:
/Scratch เป็นไฟล์ .jpg มาตรฐาน.jpg )PHAssetCreationRequest พร้อมชุดพารามิเตอร์ที่เหมาะสม - สิ่งนี้จำเป็นเพราะวิธีการทั่วไปในการย้ายภาพไปยังข้อมูลการม้วนโฟโต้/Scratchblockcam บันทึกข้อมูลเมตาในไฟล์ที่ประมวลผล
| กลุ่ม | ติดแท็ก | ค่าที่เก็บไว้ |
|---|---|---|
| ความไม่เต็มใจ | ศิลปิน | หากเปิดใช้งานโดยผู้ใช้ชื่อผู้ใช้ |
| ความไม่เต็มใจ | ลิขสิทธิ์ | หากเปิดใช้งานโดยผู้ใช้สตริงลิขสิทธิ์ของผู้ใช้ |
| ความไม่เต็มใจ | ซอฟต์แวร์ | ชื่อรุ่นและการสร้างของ Blockcam |
| exif | userComment | รายการพารามิเตอร์ที่ใช้ในการสร้างภาพที่ประมวลผล |
ดูการอภิปรายความเป็นส่วนตัว
แผนภาพการไหลที่เรียบง่ายสำหรับการประมวลผลภาพจะแสดงด้านล่าง

เนื่องจากระยะเวลาที่ใช้ในการประมวลผลล่วงหน้าและ pixellate ภาพทุกครั้งที่มีการประมวลผลภาพใหม่ข้อมูลพิกเซล (ประกอบด้วยอาร์เรย์ของสี) จะถูกบันทึกลงในระบบไฟล์ของอุปกรณ์ หากผู้ใช้เปลี่ยนพารามิเตอร์ (เช่นรูปร่าง 3D) การประมวลผลล่วงหน้าเสร็จสมบูรณ์แล้วและข้อมูลพิกเซลจะถูกนำกลับมาใช้ใหม่ สิ่งนี้สามารถประหยัดเวลาได้มาก
หากผู้ใช้เปลี่ยนพารามิเตอร์ที่มีผลต่อการประมวลผลล่วงหน้ารูปภาพจะถูกประมวลผลซ้ำตั้งแต่ต้น (ตัวอย่างเช่นการเปลี่ยนขนาดบล็อกจะทำให้รอบการประมวลผลใหม่เต็มรูปแบบที่จะดำเนินการ)
แผนภาพการไหลที่เรียบง่ายสำหรับการประมวลผลวิดีโอจะแสดงด้านล่าง ลูกบาศก์หมายถึงกลับไปที่การไหลของภาพ

ปัจจุบันกล่องสีเขียว ("เฟรมประมวลผล") ไม่ทำงานตามที่คาดไว้/จำเป็นดังนั้นเมื่อเขียนปัจจุบันการสร้างวิดีโอไม่ได้รับการสนับสนุน
BlockCAM บันทึกข้อความและสถานะที่รันไทม์ไปยังคอนโซลดีบั๊ก (ถ้ามีอยู่และในส่วนใหญ่ของอินสแตนซ์สิ่งนี้จะไม่ปรากฏ) และไปยังฐานข้อมูล SQLite ท้องถิ่น สิ่งนี้จะช่วยให้การดีบักหลังการชันสูตรพลิกศพหากจำเป็นต้องเกิดขึ้น
ด้วยนโยบายของ Apple เกี่ยวกับการให้เช่าข้อมูล (ไม่ต้องพูดถึงนโยบายของสหภาพยุโรป) มันเป็นไปได้ที่การบันทึกทั้งหมดจะถูกลบออก (ผ่านธงเวลาคอมไพล์) สำหรับ BlockCam รุ่นที่วางจำหน่าย
การตั้งค่าผู้ใช้ทั้งหมด (และการตั้งค่ากระบวนการไม่กี่) จะถูกจัดเก็บผ่านคลาส Settings คลาสนี้ห่อหุ้มกลไกการจัดเก็บที่มองไม่เห็นกับส่วนที่เหลือของโปรแกรม ปัจจุบันกลไกการจัดเก็บคือ UserDefaults หากการตั้งค่ามีความซับซ้อนมากขึ้นมันเป็นเรื่องตรงไปตรงมาที่จะโยกย้ายสิ่งนี้ไปยังฐานข้อมูล
ในการเข้าถึงการตั้งค่าผู้โทรจะต้องใช้วิธีการที่ให้ไว้ของคลาส Settings สิ่งนี้ช่วยให้แน่ใจว่ามีความสมบูรณ์ของประเภทข้อมูล
คลาส Settings ยังให้การแจ้งเตือนระดับการตั้งค่าของการเปลี่ยนแปลง (ซึ่งเป็นเหตุผลหลักในการสร้างคลาสตั้งแต่แรก)
การตั้งค่า blockcam แสดงไว้ด้านล่าง
| เครื่องหมาย | พิมพ์ | ค่าเริ่มต้น | การใช้งาน |
|---|---|---|---|
| . | สาย | "เริ่มต้น" | ธงที่กำหนดว่าการตั้งค่าได้รับการเริ่มต้นหรือไม่ เมื่อ blockcam ทำงานเป็นครั้งแรกหาก .Initialized เป็นศูนย์หรือว่างเปล่าจะถือว่าเป็นครั้งแรกที่ blockcam ได้รับการเรียกใช้และดังนั้นจึงเขียนค่าเริ่มต้นสำหรับการตั้งค่าทั้งหมด |
| . blocksize | จำนวนเต็ม | 48 | ขนาดบล็อกสำหรับการประมวลผลภาพ นี่คือขนาดสี่เหลี่ยมของแต่ละพื้นที่พิกเซล |
| . Shapetype | สาย | "บล็อก" | วัตถุ 3 มิติเดียวกันในแต่ละภูมิภาคพิกเซล หล่อจาก enum |
| .invertheight | บูลีน | เท็จ | ธงการกำหนดความสูง/ขนาดกลับด้าน |
| .HeightSource | สาย | "ความสว่าง" | ช่องสีเพื่อใช้ในการกำหนดความสูง/ขนาด หล่อจาก enum |
| . ImagesizeConstraints | สาย | "ปานกลาง" | กำหนดปริมาณการลดขนาดของภาพที่ต้องทำก่อนประมวลผลด้วยเหตุผลด้านประสิทธิภาพ หล่อจาก enum มูลค่าจริงตีความในเวลาทำงาน |
| . | สาย | "ปานกลาง" | ปริมาณของการพูดเกินจริงในแนวตั้งที่จะดำเนินการเมื่ออัดหรือขยายรูปร่าง 3 มิติ หล่อจาก enum |
| .inputquality | จำนวนเต็ม | 2 | ค่าที่ระบุคุณภาพอินพุต ช่วงตั้งแต่ 0 ถึง 3 โดย 3 เป็นคุณภาพสูงสุด (และช้าที่สุดในการประมวลผล) |
| .currentCamera | สาย | "กลับ" | ตำแหน่งของกล้องสุดท้ายที่ใช้ ด้านหน้าหรือด้านหลัง หล่อจาก enum |
| . lightColor | สาย | "สีขาว" | ชื่อของสีของแสง หล่อจาก enum อาจถูกแปลงเป็นประเภทห้องสมุดสีในภายหลัง |
| . lighttype | สาย | "Omni" | ชื่อประเภทของแสงที่ใช้ส่องสว่างฉาก หล่อจาก enum |
| .lightintensity | สาย | "ปกติ" | ความเข้มของแสงที่ใช้ส่องสว่างฉาก มูลค่าจริงที่กำหนดเมื่อรันไทม์ หล่อจาก enum |
| .FieldOfView | สาย | "ปกติ" | มุมมองของกล้อง ค่าที่แท้จริงจะถูกกำหนดเมื่อรันไทม์ หล่อจาก enum |
| . Showhistogram | บูลีน | เท็จ | แสดงการแสดงฮิสโตแกรม ไม่ได้ดำเนินการในปัจจุบัน |
| .HistogrambucketCount | จำนวนเต็ม | 256 | จำนวนสีในจอแสดงผลฮิสโตแกรม ไม่ได้ดำเนินการในปัจจุบัน |
| .initialView | สาย | "Liveview" | มุมมองสุดท้ายที่ผู้ใช้เห็น (เช่น Live View อัลบั้ม ฯลฯ ) |
| . | บูลีน | จริง | กำหนดว่าตัวอักษรจะถูกอัดอย่างเต็มที่หรืออัดเฉพาะบางส่วนเท่านั้น |
| .lettersmoothness | สาย | "เรียบ" | กำหนดว่าการสร้างเส้นโค้งเป็นตัวอักษรได้อย่างราบรื่นเพียงใด เส้นโค้งคุณภาพสูงมีค่าใช้จ่ายขนาดใหญ่ มูลค่าจริงที่กำหนดเมื่อรันไทม์ หล่อจาก enum |
| . letterfont | สาย | "Futura" | แบบอักษร (และน้ำหนักเสริม) เพื่อใช้ในการแสดงผลตัวอักษรที่อัดแน่น หากตัวอักษรไม่มีอยู่ในระบบ BlockCAM จะเข้าสู่สถานะที่ไม่ได้กำหนด |
| .RANDOMCHARACTERSORCE | สาย | "ละติน" | ชื่อช่วงของอักขระ Unicode เพื่อใช้เป็นแหล่งสำหรับตัวอักษรแบบสุ่มเมื่อรีดอักขระ หลายช่วงอาจถูกระบุโดยการแยกแต่ละอันออกจากคนอื่น ๆ ด้วยเครื่องหมายจุลภาค |
| . videofps | จำนวนเต็ม | 1 | ไม่ได้ใช้ในปัจจุบัน |
| .Videodimensions | สาย | "เล็กที่สุด" | กำหนดขนาดวิดีโอสุดท้ายเมื่อสร้างวิดีโอ มูลค่าจริงที่กำหนดเมื่อรันไทม์ หล่อจาก enum |
| .videoblocksize | จำนวนเต็ม | 48 | ขนาดบล็อกสำหรับการประมวลผลวิดีโอ นี่คือขนาดสี่เหลี่ยมของแต่ละพื้นที่พิกเซล |
| . usemetal | บูลีน | จริง | แฟล็กที่บอกให้ Blockcam ใช้โลหะมากกว่า OpenGL |
| .AntialiasingMode | จำนวนเต็ม | 0 | กำหนดโหมด antialiasing |
| .initialBestFit | บูลีน | เท็จ | ถ้าเป็นจริง blockcam จะพยายามพอดีกับโหนดทั้งหมดลงในมุมมองด้วยความแน่นที่สุดเท่าที่จะทำได้ |
| .Saveoriginalimageaceaction | สาย | "เสมอ" | กำหนดวิธีการและเวลาที่จะบันทึกภาพต้นฉบับ หล่อจาก enum |
| .nextextreentiveinteger | จำนวนเต็ม | 0 | ใช้สำหรับการสร้างชื่อไฟล์ |
| . loopextreeintegerafter | จำนวนเต็ม | 9999 | กำหนดเวลาที่จะวนซ้ำไปยังจุดเริ่มต้นเมื่อใช้จำนวนเต็มตามลำดับ |
| . startsequentialIntegerat | จำนวนเต็ม | 1 | ค่าเริ่มต้นสำหรับจำนวนเต็มตามลำดับ |
| .increasestarapexeswithprominence | บูลีน | เท็จ | ถ้าเป็นจริงจำนวนจุดสูงสุดสำหรับรูปร่างดาวจะเพิ่มขึ้นตามความโดดเด่นของความสูงของสี |
| .starapexcount | จำนวนเต็ม | 5 | จำนวนจุดสูงสุดสำหรับดวงดาว หาก .IncreaseStarApexesWithProminence -prominence เป็นจริงนี่คือจำนวนจุดเริ่มต้นของ Apexes |
| .haltwhencriticalthermal | บูลีน | จริง | ถ้าเป็นจริง blockcam จะหยุด (ผ่านการโทร fatalError ) เมื่อได้รับการแจ้งเตือนความร้อนที่สำคัญ สิ่งนี้อาจละเมิดแนวทางของ Apple และอาจถูกลบออก |
| .haltonlowpower | บูลีน | จริง | ถ้าเป็นจริง blockcam จะหยุด (ผ่านการโทร fatalError ) เมื่อได้รับการแจ้งเตือนพลังงานต่ำ สิ่งนี้อาจละเมิดแนวทางของ Apple และอาจถูกลบออก |
| .bestfitoffset | สองเท่า | 2.0 | ค่าที่จะใช้ในการสำรองกล้องออกไปเมื่อ .InitialBestFit เป็นจริงเพื่อให้พื้นที่ติดลบเล็กน้อยกับภาพ |
| . LightingModel | สาย | "พงษ์" | แบบจำลองแสงพื้นผิว หล่อจาก enum |
| .CappedlineBalllocation | สาย | "สูงสุด" | ตำแหน่งของลูกบอล ("cap") สำหรับโหนดรูปทรงปกคลุม หล่อจาก enum |
| . loggingenabled | บูลีน | เท็จ | เปิดใช้งานการบันทึกธง |
| .FontSize | จำนวนเต็ม | 36 | ขนาดตัวอักษรสำหรับตัวอักษรที่อัดแน่น |
| .Enableuisounds | บูลีน | จริง | ธงเพื่อเล่นเสียง UI (เช่นเมื่อกดปุ่ม) หากค่านี้เป็น false ธงเสียงอื่น ๆ ทั้งหมดจะถูกละเว้น |
| . enableshuttersound | บูลีน | เท็จ | ตั้งค่าสถานะเพื่อเล่นเสียงชัตเตอร์เมื่อกดปุ่มกล้อง ในบางสถานที่ทางภูมิศาสตร์สิ่งนี้จะเกิดขึ้นเสมอและการตั้งค่านี้จะไม่มีผล |
| .EnableImageProcessingSound | บูลีน | จริง | ตั้งค่าสถานะเพื่อเล่นเสียงที่จุดเริ่มต้นและสิ้นสุดของการประมวลผลภาพ เนื่องจากการประมวลผลภาพใช้เวลานานสิ่งนี้จะช่วยให้ผู้ใช้เข้าใจเมื่อภาพเสร็จสมบูรณ์ |
| .enablevideorecordingsound | บูลีน | จริง | ตั้งค่าสถานะเพื่อเล่นเสียงเมื่อผู้ใช้เริ่มต้นและหยุดการบันทึกวิดีโอ |
| .EnableButtonPressSounds | บูลีน | จริง | ตั้งค่าสถานะเพื่อเล่นเสียงเมื่อผู้ใช้กดปุ่ม |
| .EnableOptionSelectSounds | บูลีน | จริง | ตั้งค่าสถานะเพื่อเล่นเสียงเมื่อผู้ใช้เลือกตัวเลือกในการตั้งค่าการตั้งค่าบนหน้าจอ |
| .enableCrashSounds | บูลีน | เท็จ | ตั้งค่าสถานะเพื่อเล่นเสียงเมื่อมีการแสดงกล่องโต้ตอบ CRASH เปิดใช้งานเฉพาะเมื่อรวบรวมในโหมด #Debug |
| .MeshDotSize | สาย | "ปานกลาง" | ขนาดของจุดกึ่งกลางสำหรับตาข่าย หากมีการใช้ .None ไม่มีการแสดงจุดตรงกลาง หล่อจาก enum |
| .Meshlinethickness | สาย | "ปานกลาง" | ความหนาของเส้นตาข่าย หล่อจาก enum |
| . radiatinglinethickness | สาย | "ปานกลาง" | ความหนาของรูปร่างเส้นที่แผ่รังสี หล่อจาก enum |
| . radiatinglinecount | จำนวนเต็ม | 8 | จำนวนของเส้นที่แผ่รังสีในรูปร่างเส้นที่แผ่รังสี 4 สำหรับเส้นที่ชี้ไปยังทิศทางที่สำคัญ 8 สำหรับทิศทางพระคาร์ดินัลและระหว่างกันและ 16 สำหรับ 8 บรรทัดเพิ่มเติมในเครื่องบิน Z |
| .BlockChamfersize | สาย | "ไม่มี" | ความเรียบของรัศมี/ขอบขอบสำหรับรูปร่างบล็อก หล่อจาก enum |
| .Maximagedimension | จำนวนเต็ม | 1024 | มิติสูงสุดของภาพ หากภาพที่จะประมวลผลมีขนาดใหญ่ขึ้นมันจะถูกปรับขนาดเพื่อให้มิติที่ยาวที่สุดคือค่านี้ |
| .AdduserDatatoExif | บูลีน | เท็จ | ตั้งค่าสถานะเพื่อเพิ่มข้อมูลที่ผู้ใช้สร้างขึ้นในบล็อก Exif ของรูปภาพที่ประมวลผล หากรวบรวมในโหมด #Debug ค่านี้จะเริ่มต้นเป็นจริง |
| .ชื่อผู้ใช้ | สาย | - | (ค่าเริ่มต้นว่างเปล่า) ชื่อที่ผู้ใช้จัดหาซึ่งเพิ่มลงในบล็อก Exif ของรูปภาพที่ประมวลผล สิ่งนี้จะเกิดขึ้นเฉพาะในกรณีที่ .AddUserDataToExif เป็นจริง หากรวบรวมในโหมด #Debug ค่านี้จะเริ่มต้นเป็น "Stuart Rankin" |
| .USERCOPYRIGHT | สาย | - | (ค่าเริ่มต้นว่างเปล่า) สตริงลิขสิทธิ์ที่ผู้ใช้จัดสรรซึ่งเพิ่มลงในบล็อก Exif ของรูปภาพที่ประมวลผล สิ่งนี้จะเกิดขึ้นเฉพาะในกรณีที่ .AddUserDataToExif เป็นจริง หากรวบรวมในโหมด #Debug ค่านี้จะเริ่มต้นเป็น "แหล่งที่มา 3.0 Unported (CC โดย 3.0)" |
| .ConeisInverted | บูลีน | จริง | กำหนดว่ารูปทรงกรวยกลับด้านในแง่ของความลึก Z หรือไม่ |
| .Conetopoptions | สาย | .TopIsZero .Rawvalue | ตัวเลือกสำหรับการกำหนดรัศมีสูงสุดของกรวย |
| .CONEBASEOPTIONS | สาย | .BaseIsSide . RAWVALUE | ตัวเลือกสำหรับการกำหนดรัศมีพื้นฐานของกรวย |
| . showplashscreen | บูลีน | จริง | ตั้งค่าสถานะที่กำหนดว่าหน้าจอสาดสาดจะปรากฏขึ้นเมื่อเริ่มต้นหรือไม่ |
| .hueshapelist | สาย | - | รายการรูปร่างสำหรับประเภทรูปร่างตัวแปรสี |
| .SaturationShapelist | สาย | - | รายการรูปร่างสำหรับประเภทรูปร่างตัวแปรที่อิ่มตัว |
| . Brightnessshapelist | สาย | - | รายการรูปร่างสำหรับประเภทรูปร่างตัวแปรความสว่าง |
BlockCAM ใช้การประมวลผล 3 มิติซึ่งใช้ชิปกราฟิกของอุปกรณ์ หากผู้ใช้ระบุการตั้งค่าที่มีคุณภาพสูงสุดอาจเป็นไปได้ที่เงื่อนไขที่รุนแรงอาจเกิดขึ้นได้ เพื่อช่วยรักษาอุปกรณ์จากความเสียหายการตั้งค่าจะสามารถยกเลิกการดำเนินการของ blockcam เมื่อเกิดขึ้น
| เหตุการณ์ | การกระทำ | การควบคุมการตั้งค่า |
|---|---|---|
| ความร้อน | หากเหตุการณ์ความร้อนถึงขั้นตอนวิกฤต (อย่างมี .critical ในการแจ้งเตือน) หากการตั้งค่าเป็น true ข้อผิดพลาดร้ายแรงจะถูกสร้างขึ้นเพื่อลดความเครียดจากความร้อนใด ๆ ที่สร้างขึ้นโดย blockcam | .HaltWhenTooHot |
| แบตเตอรี่ | หากแบตเตอรี่เข้าสู่สถานะพลังงานต่ำหากการตั้งค่าเป็น true ข้อผิดพลาดร้ายแรงจะถูกสร้างขึ้นเพื่อช่วยรักษาอายุการใช้งานของแบตเตอรี่ก่อนที่จะชาร์จใหม่ | .HaltOnLowPower |
blockcam รองรับภาพต่อไปนี้:
ปัจจุบันมีการสนับสนุนรูปร่างต่อไปนี้ (หรือวางแผนที่จะสนับสนุน) สำหรับเอฟเฟกต์การอัดขึ้นรูป:
| รูปร่าง | พื้นเมือง | หมายเหตุ |
|---|---|---|
| ตึก | ใช่ - SCNBox | รูปร่างของกล่องพื้นเมืองยาวไปตามแกน z |
| รูปสามเหลี่ยม | เลขที่ | รูปสามเหลี่ยมด้านเท่าที่กำหนดเอง |
| เพนตากอน | เลขที่ | รูปทรงเพนตากอนดุลยภาพที่กำหนดเอง |
| หกเหลี่ยม | เลขที่ | รูปทรงหกเหลี่ยมดุลยภาพที่กำหนดเอง |
| อ็อกโทกอน | เลขที่ | รูปทรงแปดเหลี่ยมที่กำหนดเอง |
| ปิรามิด | ใช่ - SCNPyramid | รูปร่างพีระมิดพื้นเมือง |
| Toroids | ใช่ - SCNTorus | รูปร่างของ Torus พื้นเมือง |
| กระบอกสูบ | ใช่ - SCNCylinder | รูปทรงกระบอกพื้นเมือง - ทำให้เป็นวงกลมที่ดีขึ้น |
| ทรงกลม | ใช่ - SCNSphere | รูปร่างทรงกลมพื้นเมือง |
| แคปซูล | ใช่ - SCNCapsule | รูปร่างแคปซูลพื้นเมือง ไม่น่าสนใจเท่าที่พวกเขาฟัง |
| Tetrahedrons | เลขที่ | Tetrahedron ของ Tetrahedron ที่กำหนดเอง |
| ดารา | เลขที่ | รูปร่างดาวที่กำหนดเอง (มียอดเท่ากับเรดิออล) สามารถเปลี่ยนแปลงจำนวนยอดได้ |
| combinedforrgb | ใช่ - การรวมกัน | รวมทรงกลมตรีและแคปซูล |
| รวม FORHSB | ใช่ - การรวมกัน | รวมทรงกลมตรีและแคปซูล |
| ตาข่าย | เลขที่ | ไม่ได้ดำเนินการในปัจจุบัน |
| ตัวอักษร | ใช่ SCNText | ข้อความที่อัดรีดพื้นเมือง มีแนวโน้มที่จะช้าเป็นพิเศษโดยเฉพาะอย่างยิ่งกับตัวอักษรที่ไม่ใช่ลาติน |
| เส้น | ใช่ - SCNCapsule | รูปร่างแคปซูลบาง มาก |
| cappedlines | ใช่ - การรวมกัน | รูปร่างแคปซูลบาง มาก โดยมีทรงกลมที่วางไว้ที่ด้านบนกลางกลางหรือด้านล่างของเส้นขึ้นอยู่กับการตั้งค่าผู้ใช้ |
| RadiatingLines | ใช่ - การรวมกัน | หลายบรรทัดที่แผ่ออกมาจากจุดกึ่งกลาง ผู้ใช้สามารถระบุจำนวนบรรทัด นี่คือรูปร่างที่หนักหน่วง |
| การจับตามอง | สายพันธุ์ | รูปร่างที่จุดที่กำหนดจะถูกกำหนดโดยสีของพื้นที่พิกเซลดังนั้นรูปร่างสุดท้ายที่แท้จริงจะแตกต่างกันไป |
| ความอิ่มตัว | สายพันธุ์ | รูปร่างที่จุดที่กำหนดจะถูกกำหนดโดยความอิ่มตัวของภูมิภาคพิกเซลดังนั้นรูปร่างสุดท้ายที่แท้จริงจะแตกต่างกันไป |
| ความสว่าง | สายพันธุ์ | รูปร่างที่จุดที่กำหนดจะถูกกำหนดโดยความสว่างของภูมิภาคพิกเซลดังนั้นรูปร่างสุดท้ายที่แท้จริงจะแตกต่างกันไป |
แต่ละรูปร่างสำหรับภูมิภาคพิกเซลที่เป็นตัวแทนจะถูกอัดหรือขยาย การกำหนดความลึกของการอัดขึ้นรูปหรือขนาดขยายขึ้นอยู่กับสีของพื้นที่พิกเซล
| ช่องสี | การใช้งาน |
|---|---|
| สี | สีของสีกำหนดความลึก/ขนาดของวัตถุ 3D โปรดทราบว่าค่าสีเป็นวัฏจักร (โดย 0.0 เป็นหลักเหมือนกับ 1.0) ดังนั้นพิกเซลสีแดงมักจะถูกทำให้อ่อนลงในขณะที่สีเขียวจะถูกเน้น |
| ความอิ่มตัว | ค่าความอิ่มตัวของสีกำหนดความลึก/ขนาด สีที่สว่างกว่าจะใหญ่ขึ้น |
| ความสว่าง | ความสว่างของสีกำหนดความลึก/ขนาด นี่คือค่าเริ่มต้นและวิธีที่คนส่วนใหญ่คาดหวังว่าโปรแกรมจะทำงาน |
| สีแดง | ช่องสีแดงใช้เพื่อกำหนดความลึก/ขนาด |
| สีเขียว | ช่องสีเขียวใช้เพื่อกำหนดความลึก/ขนาด |
| สีฟ้า | ช่องสีน้ำเงินใช้เพื่อกำหนดความลึก/ขนาด |
| สีฟ้า | ช่องสีฟ้าสังเคราะห์ (จาก CMYK) ใช้เพื่อกำหนดความลึก/ขนาด |
| สีม่วงแดง | ช่องสัญญาณม่วงแดงสังเคราะห์ (จาก CMYK) ใช้เพื่อกำหนดความลึก/ขนาด |
| สีเหลือง | ช่องสีเหลืองสังเคราะห์ (จาก CMYK) ใช้เพื่อกำหนดความลึก/ขนาด |
| สีดำ | ช่องทางสังเคราะห์สีดำ (จาก CMYK) ใช้เพื่อกำหนดความลึก/ขนาด |
| yuv: y | ช่อง Y สังเคราะห์จากการแปลง YUV |
| yuv: คุณ | ช่องทางสังเคราะห์ U จากการแปลง YUV |
| yuv: v | ช่องทางสังเคราะห์ V จากการแปลง YUV |
blockcam รองรับธงคว่ำ ซึ่งหมายความว่าหากผู้ใช้ตั้งค่ากลับด้านความลึก/ขนาดเป็นค่าตอบแทนของตัวเองทำให้พื้นที่มืดโดดเด่นและพื้นที่แสงอ่อนหรือซ่อนเร้น
blockcam รองรับการเปลี่ยนสีของแสงเช่นเดียวกับประเภทของแสง สีนี้ถูก จำกัด อยู่ที่ชุดสีขนาดเล็กที่กำหนดไว้ล่วงหน้า ประเภทของแสงไฟแบบขนานของ Scenekit ไฟที่ไม่ใช่พารามิเตอร์ (เช่น .omni และ .spot )
ตำแหน่งของแสงไม่สามารถปรับได้โดยผู้ใช้
blockcam ใช้การใช้ธง allowsCameraControl ของ SCNView เพื่อให้ผู้ใช้ขยาย, shink หรือหมุน (ในสามแกน) ผ่านท่าทาง
เมื่อเริ่มแรกผลลัพธ์อาจปรากฏว่าค่อนข้างไกลจากมุมมอง BlockCam มีธงที่ผู้ใช้สามารถตั้งค่าได้เพื่อให้พอดีกับภาพกับมุมมอง คุณลักษณะนี้มีแนวโน้มที่จะสับสน allowsCameraControl เกี่ยวกับการขยายและหดตัว
ส่วนนี้จะหารือเกี่ยวกับรายละเอียดระดับการใช้งานที่หลากหลาย
blockcam เขียนด้วย Swift 5 ด้วย xcode 11.3
ด้วยระยะเวลาที่ยาวนานในการประมวลผลภาพการประมวลผลภาพทั้งหมดจะทำบนเธรดพื้นหลัง สิ่งนี้ต้องการการสื่อสารทั้งหมดเพื่ออัปเดตผู้ใช้ผ่าน UI ที่จะทำด้วยการโทรแบบเธรดที่เหมาะสม
TBD
blockcam เป็นลิขสิทธิ์© 2019, 2020 โดย Stuart Rankin
日本語版« Google 翻訳で翻訳»
3d ブロックカメラ
blockcam は iOS および iPados 用のカメラプログラムで、 Avfoundation を介して画像を取得し、それらの画像を単純な 3d シーンに変換します。シーンは、ユーザーによって回転および拡大縮小され、フラットイメージとして保存されます。
blockcam は Stuart Rankin によって作成されました。
blockcam のバージョン管理はVersioning.swiftで管理され、ビルド前のスクリプトステップとしてビルドごとに自動的に更新されます。 ファイルで管理され、ビルド前のスクリプトステップとしてビルドごとに自動的に更新されます。 更新にはビルド更新にはビルド 、ビルド番号、時刻、日付が含まれますが、現在、バージョン番号は手動で更新する必要があります。 以下の現在のビルド文字列も同じメカニズムによって維持されます。以下の現在のビルド文字列も同じメカニズムによって維持されます。以下の現在のビルド文字列も同じメカニズムによって維持されます。以下の現在のビルド文字列も同じメカニズムによって維持されます。以下の現在のビルド文字列も同じメカニズムによって維持されます。以下の現在のビルド文字列も同じメカニズムによって維持されます。以下の現在のビルド文字列も同じメカニズムによって維持されます。 、ビルド番号、時刻、日付が含まれますが、現在、バージョン番号は手動で更新する必要があります。
現在、バージョン管理プログラムは blockcam プロジェクトファイルのバージョン番号を更新しません。
最新のビルド: バージョン情報については、英語のセクションを参照してください。
バージョンとビルドの更新方法については、 gitHub の [versionUpdater] (https://github.com/sjrankin/versionupdater) リポジトリを参照してください。
blockcam は、可能な限りユーザーが提供する情報を含むように設計されています。 blockcam はそれを明示的に要求します。 blockcam はデフォルトでユーザーを特定できる情報を収集しません。はデフォルトでユーザーを特定できる情報を収集しません。 ユーザーは、このタイプの情報の収集を許可するためにアクティブな手順を実行する必要があります。
| 識別情報 | 使用 | 保管 |
|---|---|---|
| ユーザー名 | 処理された画像のメタデータに保存されるユーザーの名前(ユーザーが入力)) | 「 UserDefaults 」に保存されます。 |
| ユーザー著作権 | 処理された画像メタデータに保存されるユーザーの著作権文字列(ユーザーが入力)) | 「 UserDefaults 」に保存されます。 |
ユーザーが blockcam をインスタンス化すると、ライブビューモードで開きます(メイン画面にカメラのビューを表示) 。ユーザーには、次の 3 つのモードのいずれかを選択するオプションがあります。
blockcam は、次のプラットフォームでテストされています。
1.主な問題はパフォーマンスです。 古い携帯電話の大きなサイズの画像で使用すると、パフォーマンスが大幅に低下します。 ただし、セルフィーカメラは実際には非常に高速です。 BlockCamには、パフォーマンスの問題を軽減するのに役立つ特定の軽減策(ユーザー設定など)があります。 2. *漢字は非常に遅いです。*漢字を使用して押し出し画像を作成するには、古いiPhoneの場合、6分程度かかります。 3.以下でのみテスト済み:iPhone 6S +、iPhone 8、iPad Mini4。iPadPro 9.7。 4. MacCatalystは、MacカメラのAVFoundationの使用をサポートしていないため、非常に困難です。 MacCatalystバージョンでの作業は、その妨害のため現在のところ停止しています。 5.ヒストグラムはまだ実装されていません。 6.非組み込みの幾何学的図形は、組み込みの図形よりも大幅に遅いように見えます。 7. iPadOSおよびiOS 13には、混乱するデバッグセッションにつながるいくつかの追加のデバッグステートメントが残っているようです。具体的には、「BackgroundTaskを終了できません」メッセージです。
UIBezierPathを使用してさらにシェイプを追加します。 2.処理済みのライブビュー(現在の写真モードと同様)のみを表示する処理済みライブビューモードを追加します。 これはおそらく非常に電力を消費し、遅くなり、最新のハードウェアでのみ確実に動作する可能性があります。 3.ビデオを共有する-現在、画像のみを共有できます。 4.ピクセル化されたデータの使用を完全に実装します。 ほとんどのコードが配置されています。 この機能は、処理された画像データをピクセル化レベル(たとえば、各ピクセル領域の色)でユーザーのファイルシステム空間にファイルとして保存します。 利点は、形状や押し出しの深さなどの特定の設定をユーザーが変更したときに処理を高速化することです。 BlockCamには、パフォーマンスに関する4つの懸念事項があります。
BlockCamは、取り込まれた各画像をCoreImageフィルターCIPixellateを介してピクセル化された画像に変換します。 ピクセル化の後、処理アルゴリズムは高さの決定を計算します-高さはノードのサイズまたはノードの押し出しを決定します。 次に、ピクセル化された画像の各ピクセルが3D形状(ユーザーが設定)に変換され、3Dビューの現在のシーンに追加されます。
すべての処理操作は同じコードを使用しますが、有効なユーザー向けモードに応じて異なる方法(または複数回)で呼び出すことができます。
処理のために画像が取得されます。画像のソースは、iOS / iPadOSで読み取り可能な標準の画像である限り重要ではありません。画像の最も一般的なソースは、おそらくライブビューカメラです。他のソースは、フォトアルバムとビデオフレームです。
次の画像は、処理のソースです。 (これは私が初冬に庭で撮った画像です。)

画像を変換するためのパフォーマンスの犠牲を考えると、ユーザーはソース画像をより小さなサイズにサイズ変更することにより、実行される作業量を削減するオプションがあります。これは、ビデオが処理される場合、ユーザーの介入なしに発生することもあります。 (ビデオの処理は多くのメモリを消費する傾向があるため、画像ごとに数パーセントを保存してもシステムのストレスを軽減できます。)一部の画像は270°(または必要に応じて-90°)に回転され、正しく回転します。これは、画像調整ステップでも行われます。
処理された画像は、Core Imageフィルター関数を介してピクセル化されます。具体的には、BlockCamが使用する最も一般的なフィルターは「CIPixellate」です(ただし、最終的な形状に応じて他のピクセル化フィルターが使用されます)。各ピクセル化領域のサイズは、ユーザー設定によって異なります。サイズが小さいほど、全体的なパフォーマンスへの影響は大きくなりますが、「CIPixellate」(およびフィルターと同様)は依然として非常に高速です。ピクセル化された領域が小さくなるとパフォーマンスが向上する理由は、後でより多くの3Dノードが必要になるためです。
次の画像は、元の画像のピクセル化を示しています。各ピクセル化された領域は単色であることに注意してください。つまり、BlockCamは領域全体を読み取って色を取得する必要はなく、1ピクセルだけです。

次に、ピクセル化された画像が解析されます。これには、ピクセル化された各領域の色を取得する必要があります。これは予想よりも遅いステップです。画像から個々のピクセルデータを取得するには、画像を照会できるようにするためだけに大量の画像データ操作が必要です。この手順の最後に、画像は使用されなくなります。カラーデータの2D配列が次のステップに渡されます。
このステップでは、ピクセル化された画像データがローカルファイルストレージに保存されます。 これは、後でユーザーが要求する小さな視覚的な変更を簡素化するためです。
最終的なノード形状はユーザー設定です。 BlockCamを使用すると、ユーザーは多くの形状のいずれかを選択できます。組み込みの形状は、非組み込みの形状よりも速く動作する傾向があります(たとえば、球体は五角形よりも高速です)。指定したジオメトリを使用して、イメージ解析ステップから各色の3Dノードが生成されます。最終シーンの3D性を誇示するために、ノードはある次元で誇張されています。たとえば、キューブがユーザーが選択した形状である場合、長さは誇張されます。誇張は色によって決定されます-色は、ノードの拡散表面を陰影付けするために、また高さを決定するために使用されます。誇張は、ユーザーが選択可能な決定要因によって決定されます。
ノードが作成されると、そのノードはマスターノードに追加されます。すべてのノードが作成されてマスターノードに配置されると、マスターノード自体が3Dシーンに配置されます。
-マスターノードは、後のアニメーションを管理しやすくするために使用されます。
これは簡単な手順のように思えるかもしれませんが、ビデオを変換するときは非常に注意が必要です。画像を変換すると、3Dシーンが更新され、最終的にユーザーに表示されます(通常は0.5〜2.0秒以内)。ビデオの場合、ディスプレイのタイミングを正確にすることが重要です。ビデオを変換するには、各フレームをこれらの手順で実行し、3Dシーンのスナップショットを取得します。シーンが表示される前にスナップショットが撮られた場合、結果は純粋な黒のイメージになりますが、これはユーザーが見たいものではありません。したがって、BlockCamはSCNSceneRendererDelegate関数セットに参加して、シーンが実際にユーザーに表示されるタイミングを知る必要があります。
次の画像は、画像の最終的な処理済みバージョンです。これは、SCNViewでのsnapshot()呼び出しの出力です。サンプルは押し出しブロックを使用し、デフォルトのカメラの向きで表示されています。

画像が表示されると、ユーザーはそれをそのまま保存するか、いくつかの視覚的側面を編集するか、回転またはズームインまたはズームアウトしてから保存する(おそらくもう一度)オプションがあります。ビデオの場合、3Dシーンのスナップショットがキャプチャされると、シーンは破棄されます。
.SaveOriginalImageActionの値に応じて、元の画像が保存されます。 ユーザーが処理された画像を保存すると、メタデータは処理された画像とともに保存されます。 メタデータは、プログラムの名前とバージョン、およびイメージの作成時に有効なパラメーターで構成されます。
処理されたファイルの保存は、複数ステップのプロセスです。
.jpgファイルとして/Scratchディレクトリに保存されます。.jpgファイルとして)。PHAssetCreationRequestを使用します-写真ロールに画像を移動するより一般的な方法はExifデータを削除するためです)。/Scratchディレクトリから削除されます。BlockCamは、処理されたファイルにメタデータを保存します。
| グループ | タグ | 保存された値 |
|---|---|---|
| TIFF | アーティスト | ユーザーが有効にした場合、ユーザーの名前。 |
| TIFF | 著作権 | ユーザーが有効にした場合、ユーザーの著作権文字列。 |
| TIFF | ソフトウェア | BlockCamの名前、バージョン、ビルド番号。 |
| Exif | UserComment | 処理済み画像の生成に使用されるパラメーターのリスト。 |
画像の前処理とピクセル化には時間がかかるため、新しい画像が処理されるたびに、ピクセル化データ(色の配列で構成される)がデバイスのファイルシステムに保存されます。 その後、ユーザーがパラメーター(3D形状など)を変更した場合、前処理は既に完了しており、ピクセル化データは再利用されます。 これにより、大幅に時間を節約できる可能性があります。
ユーザーが前処理に影響するパラメーターを変更すると、画像は最初から再処理されます。 (たとえば、ブロックサイズを変更すると、完全な再処理サイクルが実行されます。)
BlockCamは、実行時のメッセージとステータスをデバッグコンソール(存在する場合、大部分のインスタンスでは存在しない)とローカルSQLiteデータベースに記録します。 これにより 必要が生じた場合の事後デバッグ。
Appleのデータ保持に関するポリシー(EUのポリシーは言うまでもありません)を考えると、BlockCamのすべてのリリースバージョンのログは(コンパイル時フラグを介して)削除される可能性が高いです。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。 このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。 現在、ストレージメカニズムはUserDefaultsです。 設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。 これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamの設定を以下に示します。
| 記号 | タイプ | デフォルト | 使用法 |
|---|---|---|---|
| .Initialized | สาย | "Initialized" | 設定が初期化されたかどうかを決定するフラグ。 BlockCamが最初に実行されるときに、 .Initializedがnilまたは空の場合、BlockCamが最初に実行されたと想定されるため、すべての設定のデフォルト値を書き込みます。 |
| .BlockSize | 整数 | 48 | 画像処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .ShapeType | สาย | "Blocks" | 各ピクセル化領域の3Dオブジェクトと同じ。列挙型からキャストします。 |
| .InvertHeight | Boolean | เท็จ | 反転高さ/サイズ決定フラグ。 |
| .HeightSource | สาย | "Brightness" | 高さ/サイズを決定するために使用するカラーチャンネル。列挙型からキャストします。 |
| .ImageSizeConstraints | สาย | "ปานกลาง" | パフォーマンス上の理由から、処理する前に行う画像のサイズの縮小量を決定します。列挙型からキャストします。実行時に解釈される実際の値。 |
| .VerticalExaggeration | สาย | "ปานกลาง" | 3D形状を押し出しまたは拡大するときに実行する垂直方向の誇張の量。列挙型からキャストします。 |
| .InputQuality | จำนวนเต็ม | 2 | 入力品質を示す値。 0から3の範囲で、3が最高品質(および処理が最も遅い)です。 |
| .CurrentCamera | สาย | "กลับ" | 最後に使用したカメラの位置。前面または背面。列挙型からキャストします。 |
| .LightColor | สาย | "สีขาว" | ライトの色の名前。列挙型からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .LightType | สาย | "Omni" | シーンの照明に使用されるライトのタイプの名前。列挙型からキャストします。 |
| .LightIntensity | สาย | "ปกติ" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙型からキャストします。 |
| .FieldOfView | สาย | "ปกติ" | カメラの視野。実際の値は実行時に決定されます。列挙型からキャストします。 |
| .ShowHistogram | Boolean | เท็จ | ヒストグラム表示を表示します。現在実装されていません。 |
| .HistogramBucketCount | 整数 | 256 | ヒストグラム表示の色数。現在実装されていません。 |
| .InitialView | สาย | "LiveView" | ユーザーが最後に表示したビュー(ライブビュー、アルバムなど)。 |
| .FullyExtrudeLetters | Boolean | จริง | 文字が完全に押し出されるか、部分的にのみ押し出されるかを決定します。 |
| .LetterSmoothness | สาย | "เรียบ" | 文字の曲線をどれだけスムーズに作成するかを決定します。高品質の曲線には、大きなパフォーマンスコストがかかります。実行時に決定される実際の値。列挙型からキャストします。 |
| .LetterFont | สาย | "Futura" | 押し出された文字のレンダリングに使用するフォント(およびオプションの太さ)。フォントがシステムに存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | สาย | "Latin" | 文字を押し出すときにランダムな文字のソースとして使用する名前付きUnicode範囲。複数の範囲を指定するには、それぞれをコンマで区切ります。 |
| .VideoFPS | 整数 | 1 | 現在使用されていません。 |
| .VideoDimensions | สาย | "Smallest" | ビデオを生成するときの最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙型からキャストします。 |
| .VideoBlockSize | 整数 | 48 | ビデオ処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .UseMetal | Boolean | จริง | OpenGLではなくMetalを使用するようにBlockCamに指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチエイリアスモードを決定します。 |
| .InitialBestFit | Boolean | เท็จ | trueの場合、BlockCamは、すべてのノードをビューにできるだけ厳密に合わせようとします。 |
| .SaveOriginalImageAction | สาย | "เสมอ" | 元の画像を保存する方法とタイミングを決定します。列挙型からキャストします。 |
| .NextSequentialInteger | จำนวนเต็ม | 0 | ファイル名の生成に使用。 |
| .LoopSequentialIntegerAfter | จำนวนเต็ม | 9999 | 連続する整数を使用する場合、いつループを開始するかを決定します。 |
| .StartSequentialIntegerAt | จำนวนเต็ม | 1 | 連続整数の開始値。 |
| .IncreaseStarApexesWithProminence | Boolean | เท็จ | trueの場合、星形の頂点の数は色の高さが顕著になるにつれて増加します。 |
| .StarApexCount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceがtrueの場合、これは頂点の開始数です。 |
| .HaltWhenCriticalThermal | Boolean | จริง | trueの場合、BlockCamは重大な温度アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .HaltOnLowPower | Boolean | จริง | trueの場合、BlockCamは低電力アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .BestFitOffset | สองเท่า | 2.0 | .InitialBestFitがtrueの場合にカメラを後退させて、画像にもう少しネガティブなスペースを与えるために使用する値。 |
| .LightingModel | สาย | "Phong" | 表面マテリアル照明モデル。列挙型からキャストします。 |
| .CappedLineBallLocation | สาย | "สูงสุด" | CappedLine形状のノードのボール(「キャップ」)の位置。列挙型からキャストします。 |
| .LoggingEnabled | Boolean | เท็จ | ロギングフラグを有効にします。 |
| .FontSize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .EnableUISounds | Boolean | จริง | Flagは、UIサウンドを再生します(ボタンが押されたときなど)。 この値が「false」の場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | Boolean | เท็จ | Flagは、カメラボタンが押されたときにシャッター音を再生します。 一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .EnableImageProcessingSound | Boolean | จริง | Flagは、画像処理の開始時と終了時に音声を再生します。 画像処理には時間がかかるため、ユーザーは画像がいつ完成するかを理解するのに役立ちます。 |
| .EnableVideoRecordingSound | Boolean | จริง | ユーザーがビデオの記録を開始および停止したときに音を再生するフラグ。 |
| .EnableButtonPressSounds | Boolean | จริง | ユーザーがボタンを押したときに音を再生するフラグ。 |
| .EnableOptionSelectSounds | Boolean | จริง | ユーザーが画面上の設定画面でオプションを選択したときに音を再生するフラグ。 |
| .EnableCrashSounds | Boolean | เท็จ | フラグは、クラッシュダイアログが表示されたときにサウンドを再生します。 #DEBUGモードでコンパイルされた場合のみ有効です。 |
| .MeshDotSize | สาย | "ปานกลาง" | メッシュの中心ドットのサイズ。 .Noneが使用される場合、中央のドットは表示されません。 列挙型からキャストします。 |
| .MeshLineThickness | สาย | "ปานกลาง" | メッシュラインの太さ。 列挙型からキャストします。 |
| .RadiatingLineThickness | สาย | "ปานกลาง" | 放射線形状の太さ。 列挙型からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射ライン形状の放射ラインの数。 「4」は基線方向を指す線、「8」は基線方向とその中間、および「16」はz平面のさらに8本の線を示します。 |
| .BlockChamferSize | สาย | "ไม่มี" | ブロック形状の面取り半径/エッジの滑らかさ。 列挙型からキャストします。 |
| .MaxImageDimension | 整数 | 1024 | 画像の最大寸法。 処理する画像が大きい場合、最長寸法がこの値になるようにサイズ変更されます。 |
| .AddUserDataToExif | Boolean | เท็จ | Flagは、ユーザーが作成した情報を処理済み画像のExifブロックに追加します。 |
| .ชื่อผู้ใช้ | สาย | - | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の名前。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します。 |
| .UserCopyright | สาย | - | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の著作権文字列。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します |
BlockCamは次のビジュアルをサポートしています。
現在、押し出し効果では次の形状がサポートされています(またはサポートされる予定です)。
| 形状 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい- SCNBox | Z軸に沿って長くなったネイティブボックスの形状。 |
| 三角形 | いいえ | カスタム正三角形の形状。 |
| 五角形 | いいえ | カスタム正五角形。 |
| 六角形 | いいえ | カスタム正六角形。 |
| オクトゴン | いいえ | カスタム正八角形。 |
| ピラミッド | はい- SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい- SCNTorus | ネイティブトーラス形状。 |
| シリンダー | はい- SCNCylinder | 自然なシリンダー形状-すてきな高架円になります。 |
| 球 | はい- SCNSphere | ネイティブの球形。 |
| カプセル | はい- SCNCapsule | ネイティブカプセルの形状。聞こえるほど面白くない。 |
| 四面体 | いいえ | カスタム正四面体ソリッド。 |
| 星 | いいえ | カスタム星形(半径方向に等しい頂点を持つ)。頂点の数を変えることができます。 |
| CombinedForRGB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| CombinedForHSB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| レター | はい- SCNText | ネイティブの押し出しテキスト。特に非ラテン系のアルファベットでは、非常に遅くなる傾向があります。 |
| 行 | はい- SCNCapsule | 非常に薄いカプセル形状。 |
| CappedLines | はい-組み合わせ | ユーザー設定に応じて、行の上部、中間、または下部に球体を配置した非常に薄いカプセル形状。 |
| RadiatingLines | はい-組み合わせ | 中心点から放射状に広がる複数の線。 ユーザーは行数を指定できます。 これはパフォーマンス重視の形状です。 |
代表的なピクセル化領域の各形状は、押し出しまたは拡大されます。押し出しの深さまたは拡大サイズの決定は、ピクセル化された領域の色に依存します。
| カラーチャンネル | 使用方法 |
|---|---|
| สี | 色の色相は、3Dオブジェクトの深さ/サイズを決定します。色相値は周期的であることに注意してください(0.0は基本的に1.0と同じです)。したがって、緑が強調表示されている間、赤みを帯びたピクセルは抑制される傾向があります。 |
| 彩度 | 彩度の値は深さ/サイズを決定します。明るい色は大きくなります。 |
| 明るさ | 色の明るさが深さ/サイズを決定します。これはデフォルト値であり、ほとんどの人がプログラムが機能することを期待する方法です。 |
| 赤 | 赤チャネルは深さ/サイズを決定するために使用されます。 |
| 緑 | 緑のチャネルは深さ/サイズを決定するために使用されます。 |
| 青 | 青チャンネルは深さ/サイズを決定するために使用されます。 |
| シアン | (CMYKからの)合成シアンチャンネルを使用して、深度/サイズを決定します。 |
| マゼンタ | 深さ/サイズを決定するために、CMYKからの合成マゼンタチャネルが使用されます。 |
| 黄色 | 合成の黄色チャンネル(CMYKから)を使用して深さ/サイズを決定します。 |
| 黒 | 深さ/サイズを決定するために、CMYKからの合成黒チャンネルが使用されます。 |
BlockCamは反転フラグをサポートしています。これは、ユーザーが反転を設定した場合、深度/サイズはそれ自体の比isであり、暗い領域を目立たせ、明るい領域を抑制または非表示にすることを意味します。
BlockCamは、ライトの色とライトの種類の変更をサポートしています。 色は現在、事前定義された色の小さなセットに制限されています。 ライトのタイプは、SceneKitの標準のパラメータ化されていないライト( .omniや.spotなど)に対応しています。
現在、ライトの位置はユーザーが調整することはできません。
BlockCamは、 SCNViewのallowsCameraControlフラグを使用して、ユーザーがジェスチャによって拡大、光沢、回転(3軸)できるようにします。
最初にレンダリングしたとき、結果はビューから比較的遠くにあるように見える場合があります。 BlockCamには、画像をビューに合わせるためのユーザー設定可能なフラグがあります。 この機能は、拡大と縮小に関してallowsCameraControlを混同する傾向があります。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。現在、ストレージメカニズムはUserDefaultsです。設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamは3D処理を使用し、デバイスのグラフィックチップを実行します。ユーザーが最高品質の設定を指定した場合、特定の極端な条件が発生する可能性があります。デバイスを損傷から保護するために、そのような場合にBlockCamの実行を中止する設定を使用できます。
| イベント | アクション | 設定の制御 |
|---|---|---|
| Thermal | サーマルイベントがクリティカルステージ(通知では文字通り.critical )に達すると、設定がtrueの場合、BlockCamによって作成される熱ストレスを減らす致命的なエラーが生成されます。 | .HaltWhenTooHot |
| バッテリー | バッテリーが低電力状態になった場合、設定がtrueの場合、再充電前にバッテリーの寿命を保つために致命的なエラーが生成されます。 | .HaltOnLowPower |
BlockCamの著作権©2019, 2020 by Stuart Rankin