카테고리 없음

[델파이] TImage.Picture에로드 된 WMF 파일의 비트 맵 버전을 어떻게 만들고 TSpeedButton.Glyph로 이동합니까?

행복을전해요 2021. 2. 9. 00:25

내가 배경을 그릴 것을 제안 해준 David에게 감사합니다. 작동합니다.

프로덕션 에서는 결과가 훨씬 더 예쁘기 때문에 Vcl.GraphUtils호출 ScaleImage도우미 를 사용하도록 아래 코드를 변경합니다 . 두 번째 코드 샘플을 참조하십시오.

// Quick and Dirty : No sub-pixel anti-aliasing.
// Also does not modifies Source, so set Source's size before you 
// call this. 
procedure CopyBitmap(  Source:TImage;  DestSpeedButton:TSpeedButton );
var
   bmp: TBitmap;
   begin
      bmp:=TBitmap.Create;
         try
              bmp.SetSize( Source.Width, Source.Height);
                   bmp.Canvas.Pen.Style := psClear;
                        bmp.Canvas.Brush.Style := bsSolid;
                             bmp.Canvas.Brush.Color := clFuchsia;
                                  bmp.Canvas.Rectangle(0,0, Source.Width+1,Source.Height+1 );
                                       bmp.Canvas.Draw(0,0, Source.Picture.Graphic );
                                            bmp.TransparentColor := clFuchsia;
                                                 DestSpeedButton.Glyph:=bmp;
                                                    finally
                                                         bmp.Free;
                                                            end;
                                                            end;
                                                            

대체 그 용도에 더 많은 메모리, 그리고이 사용하는 TPicture대신 유형을 TImage실제 사용에 내가조차 없기 때문에 TImage다만 TPicture,이 외모에 더 좋은합니다. TBitmap 속성 유형이있는 내 디자인 (또는 귀하의 디자인)의 일부 사용자 지정 컨트롤을 중심으로 작성되었습니다. 자신의 컨트롤을 대체하거나 원하는 경우 TMyControlWithAGlyph를 TSpeedButton으로 변경해야합니다.

// A Bit Better Looking. Uses Vcl.GraphUtils function ScaleImage
procedure CopyBitmap(  Source:TPicture;
                       Dest:TMyControlWithAGlyph;
                                              DestType:TCopyDestTypeEnum;
                                                                     AWidth,AHeight:Integer;
                                                                                            DoInvert:Boolean;
                                                                                                                   TransparentColor:TColor=clFuchsia );
                                                                                                                   var
                                                                                                                      bmp,bmpFullSize: TBitmap;
                                                                                                                         ARect:TRect;
                                                                                                                            ScaleAmount:Double;
                                                                                                                            begin
                                                                                                                               if not Assigned(Source) then
                                                                                                                                     exit;
                                                                                                                                        if not Assigned(Dest) then
                                                                                                                                              exit;
                                                                                                                                              
                                                                                                                                                 if not Assigned(Source.Graphic) then
                                                                                                                                                       exit;
                                                                                                                                                       
                                                                                                                                                       
                                                                                                                                                          bmp:=TBitmap.Create;
                                                                                                                                                             bmpFullSize := TBitmap.Create;
                                                                                                                                                                try
                                                                                                                                                                     bmpFullSize.SetSize(  Source.Width, Source.Height );
                                                                                                                                                                          bmpFullSize.PixelFormat := pf24bit;
                                                                                                                                                                               bmpFullSize.Canvas.Pen.Style := psClear;
                                                                                                                                                                                    bmpFullSize.Canvas.Brush.Style := bsSolid;
                                                                                                                                                                                         bmpFullSize.Canvas.Brush.Color := TransparentColor;
                                                                                                                                                                                              bmpFullSize.Canvas.Rectangle(0,0, Source.Width+1,Source.Height+1 );
                                                                                                                                                                                                   bmpFullSize.Canvas.Draw(0,0, Source.Graphic );
                                                                                                                                                                                                   
                                                                                                                                                                                                   
                                                                                                                                                                                                        bmp.SetSize( AWidth, AHeight);
                                                                                                                                                                                                             bmp.PixelFormat := pf24bit;
                                                                                                                                                                                                             
                                                                                                                                                                                                                  // Vcl.GraphiUtil version needs a floating point scale.
                                                                                                                                                                                                                       ScaleAmount := AWidth / Source.Width;
                                                                                                                                                                                                                            ScaleImage(bmpFullSize,bmp,ScaleAmount );
                                                                                                                                                                                                                            
                                                                                                                                                                                                                                 // This lets me have a white icon and turn it black if I want to
                                                                                                                                                                                                                                      // or vice versa
                                                                                                                                                                                                                                           if DoInvert then
                                                                                                                                                                                                                                                  InvertBitmap(bmp); 
                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                       if DestType=DestLargeGlyph then
                                                                                                                                                                                                                                                            begin
                                                                                                                                                                                                                                                                      Dest.LargeGlyph := bmp;
                                                                                                                                                                                                                                                                           end
                                                                                                                                                                                                                                                                                else
                                                                                                                                                                                                                                                                                     begin
                                                                                                                                                                                                                                                                                               Dest.Glyph:=bmp;
                                                                                                                                                                                                                                                                                                    end;
                                                                                                                                                                                                                                                                                                       finally
                                                                                                                                                                                                                                                                                                            bmp.Free;
                                                                                                                                                                                                                                                                                                                 bmpFullSize.Free;
                                                                                                                                                                                                                                                                                                                    end;
                                                                                                                                                                                                                                                                                                                    end;
                                                                                                                                                                                                                                                                                                                    

위의 코드는 또한이 작은 도우미를 호출합니다.

function InvertBitmap(ABitmap: TBitmap): TBitmap;
var
   x, y: Integer;
      ByteArray: PByteArray;
      begin
         ABitmap.PixelFormat := pf24Bit;
            for y := 0 to ABitmap.Height - 1 do
               begin
                     ByteArray := ABitmap.ScanLine[y];
                           for x := 0 to ABitmap.Width * 3 - 1 do
                                 begin
                                          ByteArray[x] := 255 - ByteArray[x];
                                                end;
                                                   end;
                                                      Result := ABitmap;
                                                      end;
                                                      


출처
https://stackoverflow.com/questions/22050330