With a superb final climb, Kreuziger finished the penultimate mountain leg of the Giro in six hours 18 minutes and two seconds. Canadian Ryder Hesjedal crossed 19 second behind him.
Victoria's Hesjedal, who rides for Garmin-Barracuda, is 17 seconds back of Rodriguez in the general classification.
"Today was incredible," said Hesjedal. "We did a great race and I was happy with a solid finish."
Rodriguez finished third on Friday.
"Today everybody expected Hesjedal to drop, but instead he gave us a lesson," Rodriguez said. "His attack was powerful, nobody could resist it. If he's going to keep this pace tomorrow, it will be difficult to win this Giro. He's very strong, but anything can happen on the Mortirolo, many great champions have lost their energies on that climb and got into trouble, so I still have a chance to take the general classification.
"I like that climb and the Stelvio too, both of them will be crucial for the overall standings. Obviously Hesjedal now is the great favourite, today he impressed everybody. Today's stage will have a strong impact over everybody's shape, and tomorrow will be even harder: We're ready to take advantage if he's going to make a mistake."
Two-time champion Ivan Basso finished almost a minute off the pace and dropped to 1:45 behind Rodriguez. He fell to fourth in the overall standings after being overtaken by Scarponi.
"Hesjedal showed that he is the strongest," Basso said. "Everyone thought they could leave him behind and instead it's him who's left us behind. When someone's stronger you need to give them compliments. However tomorrow's stage, which I hope goes better for me, leaves everything open even if he has put a serious challenge up for this Giro.
"When I realised that I couldn't respond to the attacks, I preferred to go up at my own pace in order to avoid losing too many seconds."
It was one of the toughest stages in this year's Giro, with five categorized climbs along the 198-kilometre route from Treviso to Val di Fiemme, including two ascents on the daunting Passo Pampeago and a third category one climb.
An early break of 17 riders had a lead of six minutes before the first ascent of the day, and that grew to 10 minutes at the start of the second, the category one Passo Manghen.
Stefano Pirazzi and Sandy Casar led for most of the difficult second half of the stage after taking the lead at the start of the first climb up the Pampeago. The duo crossed the summit 31 seconds ahead of Thomas Rohregger, with five remaining riders from the initial break 20 seconds further back. The peloton was closing in fast, but still three minutes off the pace.
Pirazzi and Casar were caught by Rohregger and Emanuele Sella with 11 kilometres left, just before the second climb up the Pampeago to the finish.
However, they were being swiftly closed down by Kreuziger, who was keen to atone for a poor 17th stage which ended his chances of overall victory as he struggled on the final climb of the route to Cortina d'Ampezzo.
The Czech cyclist took the lead with three kilometres remaining and built an advantage of over a minute before Scarponi and Hesjedal attacked.
The duo swiftly cut into Kreuziger's lead but he held on for the victory.
"It's my first win in a Grand Tour, I am very happy," Kreuziger said. "I'm very disappointed with what happened at Cortina, because I came here to do something in the overall standings and not to win a stage. However, it's a day's happiness and I'll take that. If Cortina hadn't happened they wouldn't have let me go today."
There were four more withdrawals as Elia Favilli, Alfredo Balloni, Jose Rujano and Francesco Chicchi all quit, leaving 163 riders in the Giro.
Saturday's 20th stage is another difficult test, with the 219-kilometre trek from Caldes culminating in a 23-kilometre ascent up the Passo dello Stelvio, which has an average gradient of 12 per cent.
The Giro finishes on Sunday.