Вот, решил сконвертировать:
| Код | 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 Как всегда, мучаешся весь день, идешь за помощью на форум, а потом через пять минут понимаешь все сам энергетика тут такая, видимо. Кароче:
| Код | DWORD * line = (DWORD *) (bits + ((yp >> 16) * width) * sizeof(DWORD));
|
может кому пригодится... |