Kobe Bryant had 32 points and eight rebounds for the Lakers, who trailed by as many as 20 points in the fourth quarter but cut the margin to single digits in the final minutes.
The victory is the latest display of Portland's surprising resiliency despite a rash of injuries. The team has lost both of its big men - Greg Oden and Joel Przybilla - to knee injuries for the rest of the season, but the Blazers have won seven of their last 10.
The Lakers were without Pau Gasol, who missed his third straight game with a sore left hamstring. Coach Phil Jackson has said he doesn't expect Gasol back until Sunday's home game against Milwaukee, at the earliest.
Portland led by as much as eight in the first half before the Lakers tied it at 31 early in the second quarter.
The Blazers went up 47-39 on Roy's driving layup with 4:09 left in the first half, and Juwan Howard's 15-foot jumper gave Portland a 55-43 lead at the break.
Bryant hit a step-back jumper to pull the Lakers to 68-65, and Los Angeles appeared to be gaining momentum, but the Blazers effectively snuffed it when Martell Webster plowed through three Lakers and scooped the ball in to make it 81-71 at the end of the third.
Howard made a 19-foot jumper midway through the fourth, and rookie Dante Cunningham added his own long jumper to put Portland up 92-74 as the game slipped all but out of reach.
It was the Lakers' third straight loss on the road. They fell to the Los Angeles Clippers 102-91 on Wednesday.