LaMarcus Aldridge had 22 points for Portland, which also snapped the Lakers' seven-game winning streak on the road.
Portland went up 96-90 early in the fourth, but Sasha Vujacic's 3-pointer tied it at 100 midway through the quarter. Vujacic nailed another 3-pointer to tie it at 107 with 3:05 left, but the Lakers could never grab the lead.
Roy hit a pair of free throws, and Travis Outlaw hit a jumper to make it 111-107 with 2:14 left. Aldridge added a pair of free throws to extend it.
Kobe Bryant missed a 3-pointer with less than a minute to go. Roy and Jarrett Jack hit four straight shots from the line to give Portland its biggest lead, 117-107, and seal the win.
Bryant had 33 points for the Lakers, who have lost five straight at the Rose Garden.
Jarrett Jack had 21 points and 10 assists for the Blazers, who were coming off an 82-80 victory over the Los Angeles Clippers on Wednesday. A day earlier, Portland lost 96-83 at the Lakers at the Staples Center.
The Blazers also saw the return of 3-point specialist James Jones, who has been out since before the All-Star break with left knee soreness.
The Blazers are 23-12 when Jones plays and 8-14 when he doesn't. Jones finished with eight points.
The Lakers led by as many as 10 points early, but the Blazers closed to 32-27 at the end of the first quarter. Joel Przybilla's dunk pulled Portland to within 37-35, but after Przybilla fouled Bryant on the other end, the two exchanged words. Przybilla ended up with a technical.