Avatar billede hrc Mester
15. august 2008 - 14:15 Der er 3 kommentarer og
1 løsning

Ændre størrelse på bitmaps giver problemer

I mit program har jeg en ilMain og en il48x48 TImageList. ilMain indeholder de bitmaps jeg bruger i programmet og il48x48 indeholder kopi under kørslen.

Vha. en opsætning kan man vælge mellem 16, 24, 32, 48 pixel ikoner (i princippet kunne det være alt mellem 16 og 48) og til det bruger jeg følgende procedure:

  procedure ResizeImageList(ilSource, ilDest: TImageList; const aPixels: integer);
  var
    i: integer;
    iBmp, oBmp: TBitmap;
  begin
    ilDest.Clear;

    ilDest.Masked := ilSource.Masked;
    ilDest.ImageType := ilSource.ImageType;
    ilDest.DrawingStyle := ilSource.DrawingStyle;
    ilDest.ShareImages := ilSource.ShareImages;
    ilDest.BkColor := ilSource.BkColor;
    ilDest.BlendColor := ilSource.BlendColor;

    ilDest.Width := aPixels;
    ilDest.Height := aPixels;

    for i := 0 to ilSource.Count - 1 do
    begin
      iBmp := TBitmap.Create;
      oBmp := TBitmap.Create;
      try
        ilSource.GetBitmap(i,iBmp);
        SmoothResize(iBmp,oBmp,aPixels,aPixels);
        ilDest.AddMasked(oBmp,clBlack);
      finally
        oBmp.Free;
        iBmp.Free;
      end;
    end;
  end;

SmoothResize, som virker, har jeg fundet her: http://www.eksperten.dk/spm/616757

Problemet er baggrundsfarven/transparency-farven som jeg ikke kan få sat. Alle bitmaps har den grimme hvide kant omkring sig.

Hvad gør jeg forkert?

Er der noget i ovenstående procedure der ikke bliver frigivet? Tænker på Dormant-proceduren som jeg ikke helt forstår og ReleaseHandle som jeg ditto ikke helt har fattet betydningen af.

I proceduren opretter og frigiver jeg bitmappene for hvert loop. Det sker fordi jeg ikke kan finde ud af at blanke dem.
Avatar billede hrc Mester
18. august 2008 - 16:03 #1
Her er stille, hvad?

Jeg har forkastet mit oprindelige koncept med at kopiere ilMain (48x48) til il48x48 og nedskalere til brugerens ønske. Når ilMain er 48x48, sker der ændringer i toolbars, frames og alle andre steder - og de justerer sig ikke tilbage hvis der vælges anden størrelse, kun op!

Derfor er ilMain igen 16x16 mens il48x48 fortsat er 48x48 pixels. Nu tilføjes ikoner til sidstnævnte hvilket giver det problem at man ikke kan se hvilke ikoner man har valgt til knapperne. Derfor har jeg fyldt ilMain med små tal-ikoner fra 0 til 99 for så står indekset der direkte. Det virker, men sikke et arbejde at få komponenterne tilbage til oprindelig størrelse igen.

Problemet med baggrundsfarven der ikke er gennemsigtig er der stadig. Lader spørgsmålet stå lidt længere hvis nogen skulle komme på en løsning.
Avatar billede mbsnet Nybegynder
19. august 2008 - 07:00 #2
Kan man måske resize en "ekstra" bitmap (UDEN SMOOTH) og så kun tegne den med smooth der, hvor den ikke er transparent ? (Altså kopiere transparency fra en nabo bitmap)
Avatar billede hrc Mester
19. august 2008 - 08:24 #3
Jeg har kigget VCL-koden igennem (Assign og den slags). Mangler desværre TImageListens "add-dialog" som man ser i designfasen. Der var nok noget der der kunne give ledetråde.

Men så måske alligevel ikke. Til listen tilføjer jeg ICO-filer der indeholder oplysninger om maske og den slags - men når jeg skalerer sker det med bitmaps der kun indeholder pixels.
Jeg har prøvet at sætte TransparencyColor enkeltvis på bitmappene, enten direkte eller vha. Mask(aTransparencyColor). Det resulterer i sorte bitmaps.
Avatar billede hrc Mester
10. september 2008 - 09:47 #4
Har gu'hjælpe mig måttet opgive sådan et banalt problem. Jeg har vendt hver en bit uden at komme nærmere en pæn løsning. Jeg lukker nu.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester