透過画像のレンダリングを改善
This commit is contained in:
		
							parent
							
								
									dad8fff12d
								
							
						
					
					
						commit
						1075e3a005
					
				|  | @ -23,7 +23,7 @@ export default Vue.extend({ | |||
| 	computed: { | ||||
| 		style(): any { | ||||
| 			return { | ||||
| 				backgroundColor: this.user.avatarColor ? `rgb(${ this.user.avatarColor.join(',') })` : null, | ||||
| 				backgroundColor: this.user.avatarColor && this.user.avatarColor.length == 3 ? `rgb(${ this.user.avatarColor.join(',') })` : null, | ||||
| 				backgroundImage: `url(${ this.user.avatarUrl }?thumbnail)`, | ||||
| 				borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null | ||||
| 			}; | ||||
|  |  | |||
|  | @ -50,7 +50,7 @@ export default Vue.extend({ | |||
| 			return `${this.file.name}\n${this.file.type} ${Vue.filter('bytes')(this.file.datasize)}`; | ||||
| 		}, | ||||
| 		background(): string { | ||||
| 			return this.file.properties.avgColor | ||||
| 			return this.file.properties.avgColor && this.file.properties.avgColor.length == 3 | ||||
| 				? `rgb(${this.file.properties.avgColor.join(',')})` | ||||
| 				: 'transparent'; | ||||
| 		} | ||||
|  | @ -129,7 +129,7 @@ export default Vue.extend({ | |||
| 		}, | ||||
| 
 | ||||
| 		onThumbnailLoaded() { | ||||
| 			if (this.file.properties.avgColor) { | ||||
| 			if (this.file.properties.avgColor && this.file.properties.avgColor.length == 3) { | ||||
| 				anime({ | ||||
| 					targets: this.$refs.thumbnail, | ||||
| 					backgroundColor: `rgba(${this.file.properties.avgColor.join(',')}, 0)`, | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ export default Vue.extend({ | |||
| 	computed: { | ||||
| 		style(): any { | ||||
| 			return { | ||||
| 				'background-color': this.image.properties.avgColor ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent', | ||||
| 				'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent', | ||||
| 				'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)` | ||||
| 			}; | ||||
| 		} | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ export default Vue.extend({ | |||
| 		style(): any { | ||||
| 			if (this.user.bannerUrl == null) return {}; | ||||
| 			return { | ||||
| 				backgroundColor: this.user.bannerColor ? `rgb(${ this.user.bannerColor.join(',') })` : null, | ||||
| 				backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null, | ||||
| 				backgroundImage: `url(${ this.user.bannerUrl })` | ||||
| 			}; | ||||
| 		} | ||||
|  |  | |||
|  | @ -86,7 +86,7 @@ export default Vue.extend({ | |||
| 			return this.file.type.split('/')[0]; | ||||
| 		}, | ||||
| 		style(): any { | ||||
| 			return this.file.properties.avgColor ? { | ||||
| 			return this.file.properties.avgColor && this.file.properties.avgColor.length == 3 ? { | ||||
| 				'background-color': `rgb(${ this.file.properties.avgColor.join(',') })` | ||||
| 			} : {}; | ||||
| 		} | ||||
|  |  | |||
|  | @ -42,7 +42,7 @@ export default Vue.extend({ | |||
| 		}, | ||||
| 		thumbnail(): any { | ||||
| 			return { | ||||
| 				'background-color': this.file.properties.avgColor ? `rgb(${this.file.properties.avgColor.join(',')})` : 'transparent', | ||||
| 				'background-color': this.file.properties.avgColor && this.file.properties.avgColor.length == 3 ? `rgb(${this.file.properties.avgColor.join(',')})` : 'transparent', | ||||
| 				'background-image': `url(${this.file.url}?thumbnail&size=128)` | ||||
| 			}; | ||||
| 		} | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ export default Vue.extend({ | |||
| 	computed: { | ||||
| 		style(): any { | ||||
| 			return { | ||||
| 				'background-color': this.image.properties.avgColor ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent', | ||||
| 				'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent', | ||||
| 				'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)` | ||||
| 			}; | ||||
| 		} | ||||
|  |  | |||
|  | @ -84,7 +84,7 @@ export default Vue.extend({ | |||
| 		style(): any { | ||||
| 			if (this.user.bannerUrl == null) return {}; | ||||
| 			return { | ||||
| 				backgroundColor: this.user.bannerColor ? `rgb(${ this.user.bannerColor.join(',') })` : null, | ||||
| 				backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null, | ||||
| 				backgroundImage: `url(${ this.user.bannerUrl })` | ||||
| 			}; | ||||
| 		} | ||||
|  |  | |||
|  | @ -171,6 +171,9 @@ const addFile = async ( | |||
| 
 | ||||
| 			log('calculate average color...'); | ||||
| 
 | ||||
| 			const info = await prominence(gm(fs.createReadStream(path), name)).identify(); | ||||
| 			const isTransparent = info ? info['Channel depth'].Alpha != null : false; | ||||
| 
 | ||||
| 			const buffer = await prominence(gm(fs.createReadStream(path), name) | ||||
| 				.setFormat('ppm') | ||||
| 				.resize(1, 1)) // 1pxのサイズに縮小して平均色を取得するというハック
 | ||||
|  | @ -182,7 +185,7 @@ const addFile = async ( | |||
| 
 | ||||
| 			log(`average color is calculated: ${r}, ${g}, ${b}`); | ||||
| 
 | ||||
| 			return [r, g, b]; | ||||
| 			return isTransparent ? [r, g, b, 255] : [r, g, b]; | ||||
| 		})(), | ||||
| 		// folder
 | ||||
| 		(async () => { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue