Handle thumb errors, normalize non-int8

pull/1615/head
Piero Toffanin 2025-02-18 20:28:19 +01:00
rodzic 8570bf8e42
commit 16fca87086
2 zmienionych plików z 21 dodań i 2 usunięć

Wyświetl plik

@ -8,6 +8,7 @@ import rasterio
from rasterio.enums import ColorInterp from rasterio.enums import ColorInterp
from PIL import Image from PIL import Image
import io import io
import numpy as np
from shutil import copyfileobj, move from shutil import copyfileobj, move
from django.core.exceptions import ObjectDoesNotExist, SuspiciousFileOperation, ValidationError from django.core.exceptions import ObjectDoesNotExist, SuspiciousFileOperation, ValidationError
@ -453,7 +454,20 @@ class TaskThumbnail(TaskNestedView):
thumb_size, thumb_size,
thumb_size, thumb_size,
), resampling=rasterio.enums.Resampling.nearest).transpose((1, 2, 0)) ), resampling=rasterio.enums.Resampling.nearest).transpose((1, 2, 0))
if img.dtype != np.uint8:
img = img.astype(np.float32)
# Ignore alpha values
minval = img[:,:,:3].min()
maxval = img[:,:,:3].max()
if minval != maxval:
img[:,:,:3] -= minval
img[:,:,:3] *= (255.0/(maxval-minval))
img = img.astype(np.uint8)
img = Image.fromarray(img) img = Image.fromarray(img)
output = io.BytesIO() output = io.BytesIO()
img.save(output, format='PNG', quality=quality) img.save(output, format='PNG', quality=quality)

Wyświetl plik

@ -48,6 +48,7 @@ class TaskListItem extends React.Component {
view: "basic", view: "basic",
showMoveDialog: false, showMoveDialog: false,
actionLoading: false, actionLoading: false,
thumbLoadFailed: false
} }
for (let k in props.data){ for (let k in props.data){
@ -429,6 +430,10 @@ class TaskListItem extends React.Component {
} }
} }
handleThumbError = e => {
this.setState({thumbLoadFailed: true});
}
render() { render() {
const task = this.state.task; const task = this.state.task;
const name = task.name !== null ? task.name : interpolate(_("Task #%(number)s"), { number: task.id }); const name = task.name !== null ? task.name : interpolate(_("Task #%(number)s"), { number: task.id });
@ -610,10 +615,10 @@ class TaskListItem extends React.Component {
</tbody> </tbody>
</table> </table>
</div> </div>
{task.status === statusCodes.COMPLETED ? {!this.state.thumbLoadFailed && task.status === statusCodes.COMPLETED ?
<div className="col-md-3 col-sm-2 text-center"> <div className="col-md-3 col-sm-2 text-center">
<a href={`/map/project/${task.project}/task/${task.id}/`}> <a href={`/map/project/${task.project}/task/${task.id}/`}>
<img className="task-thumbnail" src={this.thumbnailUrl()} alt={_("Thumbnail")}/> <img onError={this.handleThumbError} className="task-thumbnail" src={this.thumbnailUrl()} alt={_("Thumbnail")}/>
</a> </a>
</div> : ""} </div> : ""}