Umkehrfunktion
-
Hi,
ich versuche zurzeit einen Umkehralgorhitmus zu schreiben. Es geht darum: ich habe einen Framebuffer, der die Pixel in einem bestimmten Format speichert. Er speichert damit in einer Variablen (u32) 2 Bildpunkte. Ich habe eine Funktion, welche mir 2 RGB Werte (= 2 pixel) in dieses Format umrechnet. Nur will ich nun von diesem Format wieder zurück zu den 2 RGB Werten und was soll ich sagen, ich steh TOTAl auf dem schlauch! Ich bin für jeden kleinen denkanstoß sehr dankbar (und nein, ich will meine arbeit nicht auf andere abwälzen, falls es das heißt, aber ich finde einfach keinen ansatzpunkt).
MfG
Und hier die Funktion:
u32 CvtRGB (u8 r1, u8 g1, u8 b1, u8 r2, u8 g2, u8 b2) { int y1, cb1, cr1, y2, cb2, cr2, cb, cr; y1 = (299 * r1 + 587 * g1 + 114 * b1) / 1000; cb1 = (-16874 * r1 - 33126 * g1 + 50000 * b1 + 12800000) / 100000; cr1 = (50000 * r1 - 41869 * g1 - 8131 * b1 + 12800000) / 100000; y2 = (299 * r2 + 587 * g2 + 114 * b2) / 1000; cb2 = (-16874 * r2 - 33126 * g2 + 50000 * b2 + 12800000) / 100000; cr2 = (50000 * r2 - 41869 * g2 - 8131 * b2 + 12800000) / 100000; cb = (cb1 + cb2) >> 1; cr = (cr1 + cr2) >> 1; return (y1 << 24) | (cb << 16) | (y2 << 8) | cr; }
Edit:
Die originalwerte hab ich per shifts nun wiederhergestellt bekommen:
i = CvtRGB(0xFF,0xFF,0xe4,0xc7,0x41,0x44); printf("\n"); int y1, cb, y2, cr; y1 = (int)(i >> 24); cb = (int)((i << 8) >> 24); y2 = (int)((i << 16) >> 24); cr = (int)((i << 24) >> 24);
Nur wie bekomme ich aus y1 und y2 nun die originalwerte wieder raus?
Danke!
-
r = (1181398753·y1 - 50·(169·cb1 - 4·(8281591·cr1 - 1060038240)))/1181398753
g = (1181398753·y1 - 50·(8131169·cb1 + 4·(4218409·cr1 - 800153760)))/1181398753
b = (1181398753·y1 + 2093441550·cb1 + 200·(91·cr1 - 1339814240))/1181398753
-
ich habe cr1, usw nicht, ich habe nur das ergebniss von CvtRGB. Aus dem ergebniss bekomme ich cb, cr, y1, y2, mehr aber nicht, und in diesem sind 2 pixel gespreichert, also r1, r2, g1, g2, b1, b2. Wie gesagt, pro u32 bei diesem Framebuffer sind 2 pixel gespeichert, nicht nur eins.
MfG
ps: so langsam glaube ich nicht das es überhaupt möglich ist