Mega Code Archive

 
Categories / Delphi / Graphic
 

How to resample a Bitmap

Title: How to resample a Bitmap type PBitmap = ^TBitmap; TLine = array[0..MaxInt div SizeOf(TRGBQUAD) - 1] of TRGBQUAD; PLine = ^TLine; function ResampleSubBitmap(Bitmap: TBitmap; XPos, YPos, Width, Height: Integer): TRGBQuad; var r, g, b: Cardinal; Line: PLine; x, y, z: Integer; begin z := (Width * Height); r := 0; g := 0; b := 0; if (YPos + Height) = Bitmap.Height then Height := (Bitmap.Height - YPos) - 1; if (XPos + Width) = Bitmap.Width then Width := (Bitmap.Width - XPos) - 1; for y := YPos to YPos + Height do begin Line := Bitmap.ScanLine[y]; for x := XPos to XPos + Width do begin r := r + Line[x].rgbRed; g := g + Line[x].rgbGreen; b := b + Line[x].rgbBlue; Inc(z); end; end; if (z = 0) then z := 1; r := Round((r / z) * 1.4); if (r 255) then r := 255; g := Round((g / z) * 1.4); if (g 255) then g := 255; b := Round((b / z) * 1.4); if (b 255) then b := 255; Result.rgbRed := r; Result.rgbGreen := g; Result.rgbBlue := b; end; function ResampleBitmap(Bitmap: TBitmap; NewWidth, NewHeight: Integer): Boolean; var Temp: TBitmap; Line: PLine; x, y: Integer; Blockheight, Blockwidth: Cardinal; BlockPosX, BlockPosY: Single; BlockDiffX, BlockDiffY: Single; XPos, YPos: Single; DiffX, Diffy: Single; begin Result := True; Temp := TBitmap.Create; //Alles mu? 32 Bit sein Bitmap.PixelFormat := pf32Bit; Temp.PixelFormat := pf32Bit; Temp.Height := NewHeight; Temp.Width := NewWidth; BlockDiffY := (Bitmap.Height / NewHeight); BlockDiffX := (Bitmap.Width / NewWidth); //Gr??e eines Blockes BlockHeight := Trunc(BlockDiffY); BlockWidth := Trunc(BlockDiffY); DiffX := 1; DiffY := 1; BlockPosY := 0; YPos := 0; //Jede Spalte for y := 0 to NewHeight - 1 do begin BlockPosX := 0; XPos := 0; //Jede Zeile Line := Temp.ScanLine[Trunc(YPos)]; for x := 0 to NewWidth - 1 do begin Line[Trunc(XPos)] := ResampleSubBitmap(Bitmap, Round(BlockPosX), Round(BlockPosY), Blockwidth, BlockHeight); //Einen Block/Pixel weiter BlockPosX := BlockPosX + BlockDiffX; XPos := XPos + DiffX; end; //Einen Block/Pixel weiter BlockPosY := BlockPosY + BlockDiffY; YPos := YPos + DiffY; end; Bitmap.Assign(Temp); Temp.Free; end; // Beispiel: // Example: procedure TForm1.Button1Click(Sender: TObject); begin ResampleBitmap(Image1.Picture.Bitmap, 30, 30); end;