KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
My application needs a lot of PNGs and I often mess up my code while trying to work with them. To make my life easier I made one big PNG image in Realword Paint and pasted all those small PNG images on to it. Now I have one file instead. Now all I need is to copy one PNG on to other with transparency (btw don't ask why), because I need to work with each image induvidually. I am bad programmer when it comes to working with images. I am using Delphi 7. PGNImage.Resize procedure TPngObject.Resize(const CX, CY: Integer); function Min(const A, B: Integer): Integer; begin if A < B then Result := A else Result := B; end; var Header: TChunkIHDR; Line, NewBytesPerRow: Integer; NewHandle: HBitmap; NewDC: HDC; NewImageData: Pointer; NewImageAlpha: Pointer; NewImageExtra: Pointer; begin if (CX > 0) and (CY > 0) then begin {Gets some actual information} Header := Self.Header; {Creates the new image} NewDC := CreateCompatibleDC(Header.ImageDC); Header.BitmapInfo.bmiHeader.biWidth := cx; Header.BitmapInfo.bmiHeader.biHeight := cy; NewHandle := CreateDIBSection(NewDC, pBitmapInfo(@Header.BitmapInfo)^, DIB_RGB_COLORS, NewImageData, 0, 0); SelectObject(NewDC, NewHandle); {$IFDEF UseDelphi}Canvas.Handle := NewDC;{$ENDIF} NewBytesPerRow := (((Header.BitmapInfo.bmiHeader.biBitCount * cx) + 31) and not 31) div 8; {Copies the image data} for Line := 0 to Min(CY - 1, Height - 1) do CopyMemory(Ptr(Longint(NewImageData) + (Longint(CY) - 1) * NewBytesPerRow - (Line * NewBytesPerRow)), Scanline[Line], Min(NewBytesPerRow, Header.BytesPerRow)); {Build array for alpha information, if necessary} if (Header.ColorType = COLOR_RGBALPHA) or (Header.ColorType = COLOR_GRAYSCALEALPHA) then begin GetMem(NewImageAlpha, CX * CY); Fillchar(NewImageAlpha^, CX * CY, 255); for Line := 0 to Min(CY - 1, Height - 1) do
Tags (comma-separated)
Save Edits
Cancel