Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Fast DIB Resize


Автор: stab 7.11.2004, 15:52
Вот, решил сконвертировать:

Код

procedure FastResize32(Src,Dst:TFastDIB);
var
 x,y,xp,yp,sx,sy: Integer;
 Line: PLine32;
 pc: PFColorA;
begin
 sx:=(Src.Width shl 16)div Dst.Width;
 sy:=(Src.AbsHeight shl 16)div Dst.AbsHeight;
 yp:=0; pc:=Pointer(Dst.Bits);
 for y:=0 to Dst.AbsHeight-1 do
 begin
   Line:=Src.Scanlines[yp shr 16]; xp:=0;
   for x:=0 to Dst.Width-1 do
   begin
     pc^:=Line[xp shr 16];
     Inc(pc); Inc(xp,sx);
   end;
   pc:=Ptr(Integer(pc)+Dst.Gap);
   Inc(yp,sy);
 end;
end;


получил:

Код

void DIB::FastResize32(DIB * dst)
{
if (!dst->width || !dst->height) return;

int sx = (width << 16) / dst->width;
int sy = (height << 16) / dst->height;
int yp = 0;
DWORD * pc = (DWORD *) dst->bits;

for (int y = 0; y < dst->height; y++)
{
 DWORD * line = (DWORD *) (bits + (yp >> 16) * width);
 int xp = 0;
 for (int x = 0; x < dst->width; x++)
 {
  *pc = line[xp >> 16];
  pc++;
  xp += sx;
 }
 //pc:=Ptr(Integer(pc)+Dst.Gap); gap for 32bpp dibs is always 0
 yp += sy;
}
}


но, не работает, получается какая-то странная смесь пикселей исходного изображения, в чем может быть проблема? Вроде же код переписан один в один, а оригинал точно работает.
Добавлено @ 16:00
Как всегда, мучаешся весь день, идешь за помощью на форум, а потом через пять минут понимаешь все сам smile энергетика тут такая, видимо. Кароче:

Код

DWORD * line = (DWORD *) (bits + ((yp >> 16) * width) * sizeof(DWORD));


может кому пригодится...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)