diff --git a/thunar/thunar-window.c b/thunar/thunar-window.c
index ca6d8cb89c8b094428b325ce730aabf176b28040..824db137ccbc4a12a00629585ad195b935b2957b 100644
--- a/thunar/thunar-window.c
+++ b/thunar/thunar-window.c
@@ -3789,7 +3789,11 @@ image_preview_update (GtkWidget     *parent,
                       GtkAllocation *allocation,
                       GtkWidget     *image)
 {
-  ThunarWindow *window = THUNAR_WINDOW (gtk_widget_get_toplevel (parent));
+  ThunarWindow    *window = THUNAR_WINDOW (gtk_widget_get_toplevel (parent));
+  GdkPixbuf       *scaled_preview;
+  cairo_surface_t *surface;
+  gint             new_size;
+  gint             scale_factor;
 
   _thunar_return_if_fail (THUNAR_IS_WINDOW (window));
 
@@ -3797,12 +3801,12 @@ image_preview_update (GtkWidget     *parent,
   if (window->preview_image_pixbuf == NULL)
     return;
 
+
   if (allocation != NULL)
     {
-      gtk_image_set_from_pixbuf (GTK_IMAGE (image), exo_gdk_pixbuf_scale_ratio (window->preview_image_pixbuf,
-                                                                                allocation->width < allocation->height ?
-                                                                                allocation->width - 50 :
-                                                                                allocation->height - 50));
+      new_size = allocation->width < allocation->height ?
+          allocation->width - 50 :
+          allocation->height - 50;
     }
   else
     {
@@ -3810,14 +3814,18 @@ image_preview_update (GtkWidget     *parent,
       gtk_widget_get_allocation (parent, &alloc);
       if (alloc.width - 50 <= 0) /* the widget doesn't have any allocated space */
         return;
-      gtk_image_set_from_pixbuf (GTK_IMAGE (image), exo_gdk_pixbuf_scale_ratio (window->preview_image_pixbuf,
-                                                                                alloc.width < alloc.height ?
-                                                                                alloc.width - 50 :
-                                                                                alloc.height - 50));
+      new_size = alloc.width < alloc.height ?
+          alloc.width - 50 :
+          alloc.height - 50;
     }
 
-  /* GtkImage has its own reference for the pixbuf, and we want to pass ownership to it */
-  g_object_unref (gtk_image_get_pixbuf (GTK_IMAGE (image)));
+  scale_factor = gtk_widget_get_scale_factor (parent);
+  scaled_preview = exo_gdk_pixbuf_scale_ratio (window->preview_image_pixbuf, new_size * scale_factor);
+  surface = gdk_cairo_surface_create_from_pixbuf (scaled_preview, scale_factor, gtk_widget_get_window (parent));
+  gtk_image_set_from_surface (GTK_IMAGE (image), surface);
+
+  g_object_unref (G_OBJECT (scaled_preview));
+  cairo_surface_destroy (surface);
 }