Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        //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]);
                        }
                    }
                }
            }
        }