diff --git a/turbojpeg.c b/turbojpeg.c
index 9e622ae..766a6d1 100644
--- a/turbojpeg.c
+++ b/turbojpeg.c
@@ -2738,22 +2738,21 @@
   srcSubsamp = getSubsamp(&this->dinfo);
 
   for (i = 0; i < n; i++) {
-    int dstSubsamp = (t[i].options & TJXOPT_GRAY) ? TJSAMP_GRAY : srcSubsamp;
-
-    if (t[i].op == TJXOP_TRANSPOSE || t[i].op == TJXOP_TRANSVERSE ||
-        t[i].op == TJXOP_ROT90 || t[i].op == TJXOP_ROT270) {
-      if (dstSubsamp == TJSAMP_422) dstSubsamp = TJSAMP_440;
-      else if (dstSubsamp == TJSAMP_440) dstSubsamp = TJSAMP_422;
-      else if (dstSubsamp == TJSAMP_411) dstSubsamp = TJSAMP_441;
-      else if (dstSubsamp == TJSAMP_441) dstSubsamp = TJSAMP_411;
-    }
-
     if (!jtransform_request_workspace(dinfo, &xinfo[i]))
       THROW("Transform is not perfect");
 
     if (xinfo[i].crop) {
+      int dstSubsamp = (t[i].options & TJXOPT_GRAY) ? TJSAMP_GRAY : srcSubsamp;
+
+      if (t[i].op == TJXOP_TRANSPOSE || t[i].op == TJXOP_TRANSVERSE ||
+          t[i].op == TJXOP_ROT90 || t[i].op == TJXOP_ROT270) {
+        if (dstSubsamp == TJSAMP_422) dstSubsamp = TJSAMP_440;
+        else if (dstSubsamp == TJSAMP_440) dstSubsamp = TJSAMP_422;
+        else if (dstSubsamp == TJSAMP_411) dstSubsamp = TJSAMP_441;
+        else if (dstSubsamp == TJSAMP_441) dstSubsamp = TJSAMP_411;
+      }
       if (dstSubsamp == TJSAMP_UNKNOWN)
-        THROW("Could not determine subsampling level of JPEG image");
+        THROW("Could not determine subsampling level of destination image");
       if ((t[i].r.x % tjMCUWidth[dstSubsamp]) != 0 ||
           (t[i].r.y % tjMCUHeight[dstSubsamp]) != 0)
         THROWI("To crop this JPEG image, x must be a multiple of %d\n"
@@ -2766,15 +2765,10 @@
 
   for (i = 0; i < n; i++) {
     JDIMENSION dstWidth = dinfo->image_width, dstHeight = dinfo->image_height;
-    int dstSubsamp = (t[i].options & TJXOPT_GRAY) ? TJSAMP_GRAY : srcSubsamp;
 
     if (t[i].op == TJXOP_TRANSPOSE || t[i].op == TJXOP_TRANSVERSE ||
         t[i].op == TJXOP_ROT90 || t[i].op == TJXOP_ROT270) {
       dstWidth = dinfo->image_height;  dstHeight = dinfo->image_width;
-      if (dstSubsamp == TJSAMP_422) dstSubsamp = TJSAMP_440;
-      else if (dstSubsamp == TJSAMP_440) dstSubsamp = TJSAMP_422;
-      else if (dstSubsamp == TJSAMP_411) dstSubsamp = TJSAMP_441;
-      else if (dstSubsamp == TJSAMP_441) dstSubsamp = TJSAMP_411;
     }
 
     if (xinfo[i].crop) {
@@ -2786,6 +2780,17 @@
       dstWidth = xinfo[i].crop_width;  dstHeight = xinfo[i].crop_height;
     }
     if (this->noRealloc) {
+      int dstSubsamp = (t[i].options & TJXOPT_GRAY) ? TJSAMP_GRAY : srcSubsamp;
+
+      if (t[i].op == TJXOP_TRANSPOSE || t[i].op == TJXOP_TRANSVERSE ||
+          t[i].op == TJXOP_ROT90 || t[i].op == TJXOP_ROT270) {
+        if (dstSubsamp == TJSAMP_422) dstSubsamp = TJSAMP_440;
+        else if (dstSubsamp == TJSAMP_440) dstSubsamp = TJSAMP_422;
+        else if (dstSubsamp == TJSAMP_411) dstSubsamp = TJSAMP_441;
+        else if (dstSubsamp == TJSAMP_441) dstSubsamp = TJSAMP_411;
+      }
+      if (dstSubsamp == TJSAMP_UNKNOWN)
+        THROW("Could not determine subsampling level of destination image");
       alloc = FALSE;
       dstSizes[i] = tj3JPEGBufSize(dstWidth, dstHeight, dstSubsamp);
     }
