Avatar billede speedy Nybegynder
05. februar 2000 - 16:27 Der er 3 kommentarer og
2 løsninger

Ændre farvedybde

I mange programmer kan man ændre farvedybden i et billede. det kan jeg også ved hjælp af

Bitmap.PixelFormat := pf8Bit;

Men i mange billedprogrammer - f.eks psp - kan man vælge det der hedder 'Error diffusion" eller noget i den stil. hvordan gør jeg det ??
Avatar billede sjensen Nybegynder
05. februar 2000 - 23:35 #1
speedy,

Det du begiver dig ud i er alt andet end let og enkelt. Men dog muligt:

Du skal bruge Windows API kald og behandle din bitmap afhængigt af hvad du vil. Hvordan du lige lave en "error diffusion" rutine kan jeg ikke hjælpe til med da jeg ikke selv er så stærk på det område, men for at ændre på bitmaps, farvedybde, farvetyper o.s.v. skal du bruge følgende API kald og windows strukturer:

GetDIBits, (funktion)
SetDIBits, (funktion)
BITMAPINFO, (Struktur)
BITMAPINFOHEADER, (Struktur
RGBQUAD, (Struktur)

Du kan selv finde andre relevante efterhånden som du får tygget dig igennem hjælpeteksten i Win32.hlp

Go fornøjelse i øvrigt !

sjensen
Avatar billede speedy Nybegynder
06. februar 2000 - 10:43 #2
Jamen jeg kan sagtens ændre farvedybden, så jeg venter lige på om der er andre der ved noget med "error diffusion"

/SpEeDy
Avatar billede sjensen Nybegynder
06. februar 2000 - 11:15 #3
speedy,

det forstår jeg, men der findes ikke en speciel "Error Diffusion" funktion / API. Der er noget du selv skal lave og det gøres via det API kald jeg har angivet.

sjensen
Avatar billede pd Nybegynder
13. februar 2000 - 20:51 #4
Speedy, Error Diffusion går ud på at fordele fejlene.

Man bruger normalt en ret enkel algoritme, der kører rækkevis - dvs. fejlene bliver fordelt indenfor samme række.

Normal fremgangsmåde: pixel1.color := bedste bud (man kan ikke error-diffuse den første pixel). Fejlen mellem den nye farve og den oprindelige mellemlagres i en variabel, fx. DC ("Delta Color").

Pixel2.Color udregnes som "bedste bud + DC". Igen vil en ny fejl opstå, som igen lagres i DC.

Og så gentages proceduren hele linien igennem. Er den til at forstå?

Pseudokode:
DC := 0;
for P := 0 to N-1 do
begin
  OldColor := Pixel[P].Color;
  Pixel[P].Color := CalcNearesColor[DC+Pixel[P].Color];
  DC := Pixel[P].Color-OldColor;
end;


Avatar billede speedy Nybegynder
23. februar 2000 - 13:43 #5
Tak for hjælpen begge to. Undskyld det tog så lang tid, men jeg havde ikke fået en E_mail reply fra eksperten om at en ny havde svaret. Men det havde der ;-)

/SpEeDy
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