@@ -500,7 +500,8 @@ RawImage DngDecoder::decodeRawInternal() {
500500void  DngDecoder::handleMetadata (const  TiffIFD* raw) {
501501  //  Crop
502502  if  (const  std::optional<iRectangle2D> aa = parseACTIVEAREA (raw))
503-     mRaw ->subFrame (*aa);
503+     if  (aa->hasPositiveArea ())
504+       mRaw ->subFrame (*aa);
504505
505506  if  (raw->hasEntry (TiffTag::DEFAULTCROPORIGIN) &&
506507      raw->hasEntry (TiffTag::DEFAULTCROPSIZE)) {
@@ -509,13 +510,19 @@ void DngDecoder::handleMetadata(const TiffIFD* raw) {
509510    const  TiffEntry* size_entry = raw->getEntry (TiffTag::DEFAULTCROPSIZE);
510511
511512    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-                    });
513+     std::array<unsigned , 2 > tl = {0 , 0 };
514+     try  {
515+       std::transform (tl_r.begin (), tl_r.end (), tl.begin (),
516+                      [](const  NotARational<unsigned >& r) {
517+                        if  (r.den  == 0  || r.num  % r.den  != 0 )
518+                          ThrowRDE (" Error decoding default crop origin"  );
519+                        return  r.num  / r.den ;
520+                      });
521+     } catch  (const  RawDecoderException& e) {
522+       //  We push back errors from the crop parser, since the image may still
523+       //  be usable
524+       mRaw ->setError (e.what ());
525+     }
519526
520527    if  (iPoint2D cropOrigin (tl[0 ], tl[1 ]);
521528        cropped.isPointInsideInclusive (cropOrigin))
@@ -524,13 +531,20 @@ void DngDecoder::handleMetadata(const TiffIFD* raw) {
524531    cropped.dim  = mRaw ->dim  - cropped.pos ;
525532
526533    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-                    });
534+     std::array<unsigned , 2 > sz = {static_cast <unsigned >(mRaw ->dim .x ),
535+                                   static_cast <unsigned >(mRaw ->dim .y )};
536+     try  {
537+       std::transform (sz_r.begin (), sz_r.end (), sz.begin (),
538+                      [](const  NotARational<unsigned >& r) {
539+                        if  (r.den  == 0  || r.num  % r.den  != 0 )
540+                          ThrowRDE (" Error decoding default crop size"  );
541+                        return  r.num  / r.den ;
542+                      });
543+     } catch  (const  RawDecoderException& e) {
544+       //  We push back errors from the crop parser, since the image may still
545+       //  be usable
546+       mRaw ->setError (e.what ());
547+     }
534548
535549    if  (iPoint2D size (sz[0 ], sz[1 ]);
536550        size.isThisInside (mRaw ->dim ) &&
0 commit comments