Avatar billede spectual Nybegynder
07. januar 2002 - 07:44 Der er 5 kommentarer og
2 løsninger

RGB -> YUV2

Jeg har et bitmap i mit program, som jeg har en pointer til (unsigned char *).

Bitmap\'et ligger som ukomprimeret RGB 24bpp format.

Det bitmap vil jeg gerne konventere således at jeg får bitmap\'et i YUV2 (16 bit) format (som man ser i divx4 filer).

Er der nogen der enten har sourcekode til en rutine, der kan det, eller kan hjælpe mig med at lave een?
Avatar billede spectual Nybegynder
07. januar 2002 - 07:45 #1
de 16 bits er fordelt: 6 bits for Y, 5 bits for U og 5 bits for V.
Avatar billede jpk Nybegynder
07. januar 2002 - 09:13 #2
Du skriver ikke hvilket miljø du bruger, men hvis det er VC++, kan du jo prøve at kigge her:
http://www.codeguru.com/bitmap/ChangingColorDepth.html

Avatar billede soepro Nybegynder
07. januar 2002 - 15:55 #3
Hvad f..... er Y, U og V for nogle størrelser ? (Jeg er med på R=Red, G=Green og B=Blue.)
Avatar billede spectual Nybegynder
07. januar 2002 - 19:54 #4
Jeg bruger Visual C++ 6.

Jeg har fundet følgende formular til omregning af RGB til YUV:

y = 0.3r + 0.6g + 0.1b
u = b - y
v = r - y

y varierer fra 0 til 255
u og v varierer fra -255 til 255.

Disse omregninger skal jeg have pakket ned i et 16 bit word (fordelt som før omtalt).

Jeg er ikke sikker på hvorledes de negative tal repræsenteres i YUV2 formatet.
Avatar billede spectual Nybegynder
07. januar 2002 - 19:58 #5
det vil også være en stor hjælp, hvis jeg kan få fat i et (færdigt) program (evt. uden sourcekode), der kan konventere fra et RGB 24bit bmp til et yuv 24 eller 16 bit bmp eller avi.
Avatar billede soepro Nybegynder
08. januar 2002 - 09:03 #6
Ud af formlerne ovenfor, kan jeg ikke se hvordan u eller v nogensinde kan blive 255. U kan aldrig være mere en 90% af b, V aldrig mere end 70% af r. Hvis det er korrekt at 6 bits bruges til Y, 5 til U og 5 til V, må det f.eks. være værdierne delt med 4 og 8, sådan at det kan være i det afsatte antal bits, altså noget i stil med:

r    = (RGB & 0xFF0000) >> 16;
g    = (RGB & 0x00FF00) >> 8;
b    = (RGB & 0x0000FF);
Y    = ((3*r+6*g+b)/10;
YUV2 = (y/4) << 10
    + ((b-y)/8) << 5
    + ((r-y)/8);

PaintShop PRO (som er med på de fleste computerblade\'s CD\'er hver måned, f.eks. Datatid\'s) kan konvertere fra og til stort set alle kendte formater - også reducere fra 24 bits farvedybde til 16 bit.
Avatar billede spectual Nybegynder
28. august 2002 - 23:24 #7
jeg fik i sin tid lavet een rutine i C og fandt senere en i asm.

kan poste den her hvis nogen sq være interesseret.

deler med soepro for delvist svar
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