DottedCanvas is a demo of SwiftUI + SSZipArchive. It allows you to create a dot-pattern image and zip/unzip it.
This app features a canvas and layers. The canvas includes sliders to change color, size, and the distance between dots, enabling you to create a single dot-pattern image. The layers allow you to combine multiple dot-pattern images created on the canvas into one, enabling you to create a complex dot image by overlaying dots of various colors, sizes, opacities, and offsets.
![](https://private-user-images.githubusercontent.com/51893896/268548612-731e4ec5-67d6-443e-9ea8-980ca07ddea6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA5NTMwNDUsIm5iZiI6MTcyMDk1Mjc0NSwicGF0aCI6Ii81MTg5Mzg5Ni8yNjg1NDg2MTItNzMxZTRlYzUtNjdkNi00NDNlLTllYTgtOTgwY2EwN2RkZWE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE0VDEwMjU0NVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTEzZWFmMWY0NGUzMmUxMzVhYzRiNDA0MDc4MzhiZTFmOGNlYzJlMzRmNWIyNmI3NGE5NTU3YmQ3NDFkZDIwYTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.KbXp7WR0zDyO2el-VVZ__rglroSOL-6Jw6KfmVfULKk)
![](https://private-user-images.githubusercontent.com/51893896/268548604-c25a6e76-dca0-4b05-a081-369736b1dfa9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA5NTMwNDUsIm5iZiI6MTcyMDk1Mjc0NSwicGF0aCI6Ii81MTg5Mzg5Ni8yNjg1NDg2MDQtYzI1YTZlNzYtZGNhMC00YjA1LWEwODEtMzY5NzM2YjFkZmE5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE0VDEwMjU0NVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM2MGZhY2Q4NDRkOTY5MDhmNjNjOTk3ZmE5NzdlMzUzZTg3YTgzNjYxN2QzNTA3NjI1MGE5MDM4YTY3NDIyMTcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.IQHVCaWr-0EaE60sEYUNwyZKHymymeRuO20b1D-YxRE)
![](https://private-user-images.githubusercontent.com/51893896/268548623-e8fddb8f-51b6-41ca-8cdf-a784ca3f7d2a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA5NTMwNDUsIm5iZiI6MTcyMDk1Mjc0NSwicGF0aCI6Ii81MTg5Mzg5Ni8yNjg1NDg2MjMtZThmZGRiOGYtNTFiNi00MWNhLThjZGYtYTc4NGNhM2Y3ZDJhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE0VDEwMjU0NVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI2MWMyYTU0M2NiY2FhNzM3OGFjMmY4YWVjOTg2N2U1YWE3YTJiYWFjMjdhZTFjNWQ1YTU5NjQ1MjU5YTcxNzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.UGbvWm881xVXIZ-PPTWciPPFEGxbtKRuPAWrnurGiQc)
![](https://private-user-images.githubusercontent.com/51893896/268548587-b992eb50-9473-4a0f-83f7-de8562206bf0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA5NTMwNDUsIm5iZiI6MTcyMDk1Mjc0NSwicGF0aCI6Ii81MTg5Mzg5Ni8yNjg1NDg1ODctYjk5MmViNTAtOTQ3My00YTBmLTgzZjctZGU4NTYyMjA2YmYwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE0VDEwMjU0NVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQwNThmOGQ3NDBjNmNmNjAzYTEyYWI5MzA3NWYzOWQ4MTk4NTk2YTI0ZDE5YTRjODA0NjI0ZjAzNjA2YjY0OWEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.b9TOtDsWPOt-jMOxmvvl37wAjNLjh16Xc5XIoPIS0So)
![](https://private-user-images.githubusercontent.com/51893896/268548619-1ee17410-bcd0-49f0-810e-b867696ab364.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA5NTMwNDUsIm5iZiI6MTcyMDk1Mjc0NSwicGF0aCI6Ii81MTg5Mzg5Ni8yNjg1NDg2MTktMWVlMTc0MTAtYmNkMC00OWYwLTgxMGUtYjg2NzY5NmFiMzY0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE0VDEwMjU0NVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUyYWQxZTFmOWRlNjQzNzQyMDFjMDI1M2UxMzU5NjA3ZmVmMDhmYjI1MmEwYTA1Mzk5MmYyNGZhYjVhMDc2YzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.yCuGAzsZdieoBBzuc6Tgr_RcfcDz4vKEEc794JU-wmQ)