@@ -509,13 +509,19 @@ void DngDecoder::handleMetadata(const TiffIFD* raw) {
509509    const  TiffEntry* size_entry = raw->getEntry (TiffTag::DEFAULTCROPSIZE);
510510
511511    const  auto  tl_r = origin_entry->getRationalArray (2 );
512-     std::array<unsigned , 2 > tl;
513-     std::transform (tl_r.begin (), tl_r.end (), tl.begin (),
514-                    [](const  NotARational<unsigned >& r) {
515-                      if  (r.den  == 0  || r.num  % r.den  != 0 )
516-                        ThrowRDE (" Error decoding default crop origin" 
517-                      return  r.num  / r.den ;
518-                    });
512+     std::array<unsigned , 2 > tl = {0 , 0 };
513+     try  {
514+       std::transform (tl_r.begin (), tl_r.end (), tl.begin (),
515+                      [](const  NotARational<unsigned >& r) {
516+                        if  (r.den  == 0  || r.num  % r.den  != 0 )
517+                          ThrowRDE (" Error decoding default crop origin" 
518+                        return  r.num  / r.den ;
519+                      });
520+     } catch  (const  RawDecoderException& e) {
521+       //  We push back errors from the crop parser, since the image may still
522+       //  be usable
523+       mRaw ->setError (e.what ());
524+     }
519525
520526    if  (iPoint2D cropOrigin (tl[0 ], tl[1 ]);
521527        cropped.isPointInsideInclusive (cropOrigin))
@@ -524,13 +530,20 @@ void DngDecoder::handleMetadata(const TiffIFD* raw) {
524530    cropped.dim  = mRaw ->dim  - cropped.pos ;
525531
526532    const  auto  sz_r = size_entry->getRationalArray (2 );
527-     std::array<unsigned , 2 > sz;
528-     std::transform (sz_r.begin (), sz_r.end (), sz.begin (),
529-                    [](const  NotARational<unsigned >& r) {
530-                      if  (r.den  == 0  || r.num  % r.den  != 0 )
531-                        ThrowRDE (" Error decoding default crop size" 
532-                      return  r.num  / r.den ;
533-                    });
533+     std::array<unsigned , 2 > sz = {static_cast <unsigned >(mRaw ->dim .x ),
534+                                   static_cast <unsigned >(mRaw ->dim .y )};
535+     try  {
536+       std::transform (sz_r.begin (), sz_r.end (), sz.begin (),
537+                      [](const  NotARational<unsigned >& r) {
538+                        if  (r.den  == 0  || r.num  % r.den  != 0 )
539+                          ThrowRDE (" Error decoding default crop size" 
540+                        return  r.num  / r.den ;
541+                      });
542+     } catch  (const  RawDecoderException& e) {
543+       //  We push back errors from the crop parser, since the image may still
544+       //  be usable
545+       mRaw ->setError (e.what ());
546+     }
534547
535548    if  (iPoint2D size (sz[0 ], sz[1 ]);
536549        size.isThisInside (mRaw ->dim ) &&
0 commit comments