private void FDCT(int st_vrstic, int st_stolpcev, Image slika1) { int amplituda = 128; Bitmap bitmap = (Bitmap)slika1; Color[,] barve = new Color[st_vrstic * 8, st_stolpcev * 8]; frekvence = new Frekvence[st_vrstic * 8, st_stolpcev * 8]; //napolnemo barve že prej, tako da je algoritem hitrejši... for (int i = 0; i < st_vrstic * 8; i++) { for (int j = 0; j < st_stolpcev * 8; j++) { if (i >= slika1.Width || j >= slika1.Height) { barve[i, j] = Color.White; } else { barve[i, j] = bitmap.GetPixel(i, j); } } } //računamo for (int i = 0; i < st_vrstic; i++) { for (int j = 0; j < st_stolpcev; j++) { //izračunamo po formuli for (int u = 0; u < 8; u++) { for (int v = 0; v < 8; v++) { red[u, v] = 0; green[u, v] = 0; blue[u, v] = 0; //seštejemo use pixle v bloku (barve) in upoštevamo faktor stiskanja if (12 < 15 - v - u) { for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { red[u, v] += (barve[i * 8 + x, j * 8 + y].R - amplituda) * Cos[x, u] * Cos[y, v]; green[u, v] += (barve[i * 8 + x, j * 8 + y].G - amplituda) * Cos[x, u] * Cos[y, v]; blue[u, v] += (barve[i * 8 + x, j * 8 + y].B - amplituda) * Cos[x, u] * Cos[y, v]; } } //izračunamo po formuli red[u, v] *= C[u] * C[v] * 0.25; green[u, v] *= C[u] * C[v] * 0.25; blue[u, v] *= C[u] * C[v] * 0.25; } frekvence[i * 8 + u, j * 8 + v] = new Frekvence(i * 8 + u, j * 8 + v, red[u, v], green[u, v], blue[u, v]); } } cikCak(); kodirajBlok(f1); kodirajBlok(f2); kodirajBlok(f3); } } }
//dekodira binarno sliko private void dekodiranjeBinarneSlike() { offset = 0; R = new int[64]; G = new int[64]; B = new int[64]; int[] temp_d = new int[16]; int index = 0; //dobimo visino in sirino od prvih štirih zlogov v binarni datoteki for (int i = 0; i < 16; i++) { temp_d[index] = dekodiranje[i]; index++; } dolzina_slike = convertBinToDec(temp_d); index = 0; for (int i = 16; i < 32; i++) { temp_d[index] = dekodiranje[i]; index++; } visina_slike = convertBinToDec(temp_d); double dol_del = (double)dolzina_slike / 8; double vis_del = (double)visina_slike / 8; int sirina_stolpci = (int)Math.Ceiling(dol_del); int visina_stolpci = (int)Math.Ceiling(vis_del); frekvence = new Frekvence[sirina_stolpci * 8, visina_stolpci * 8]; offset = 32; //vsak blok po sebej dekodiramo for (int b = 0; b < sirina_stolpci; b++) { for (int c = 0; c < visina_stolpci; c++) { //in seveda dekodiramo usak kanal posebaj R = dekodirajBlok(); G = dekodirajBlok(); B = dekodirajBlok(); //naredimo inverzni cik cak invCikCak(R, G, B); //nato pa zapišemo vse v naš list ki vsebuje primerke razreda Frekvence for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { frekvence[b * 8 + i, c * 8 + j] = new Frekvence(b * 8 + i, c * 8 + j, rdeca[i, j], zelena[i, j], modra[i, j]); } } } } }