コード例 #1
0
        //public CompressionHandler(Color[,] inputArray2D, int pixelMaxX, int pixelMaxY)
        //{
        //    this.inputArray2D = inputArray2D;
        //    this.pixelMaxX = pixelMaxX;
        //    this.pixelMaxY = pixelMaxY;
        //}
        // Only if no values are given, default values are set to 0
        public CompressionHandler(Color3[,] inputArray2D, int pixelMaxX, int pixelMaxY, 
            byte aPattern = 0, byte bPattern = 0, byte cPattern = 0, byte colorPattern = 0)
        {
            this.inputArray2D = inputArray2D;
            this.pixelMaxX = pixelMaxX;
            this.pixelMaxY = pixelMaxY;
            this.aPattern= aPattern;
            this.bPattern = bPattern;
            this.cPattern = cPattern;
            this.ColorPattern = colorPattern;

            outputArray2D = new Color[inputArray2D.GetLength(0), inputArray2D.GetLength(1)];
        }
コード例 #2
0
ファイル: Test.cs プロジェクト: Kundentelefon/JPEGEncode
        //Bitmap test
        public void TestChannelResolutionReduction(string inputFile, string outputFile)
        {
            // load Bitmap .png
            Bitmap bitmap = new Bitmap(inputFile);

            Color[,] picture = new Color[bitmap.Height, bitmap.Width];
            for (int x = 0; x < bitmap.Width; x++)
            {
                for (int y = 0; y < bitmap.Height; y++)
                {
                    var bitmapPixel = bitmap.GetPixel(x, y);
                    // sets RGB for each pixel
                    Color3 newPixel = new Color3
                    {
                        a = bitmapPixel.R,
                        b = bitmapPixel.G,
                        c = bitmapPixel.B
                    };
                    picture[y, x] = newPixel;
                }
            }

            //    CompressionHandler compressionHandler = new CompressionHandler(picture, bitmap.Width, bitmap.Height);

            //    // compressionhandler dont neednead parameter yet
            //    Color[,] result = compressionHandler.LocalAveraging444To422(0xDEAD);

            //    Bitmap resultImage = new Bitmap(bitmap.Width, bitmap.Height);
            //    for (int y = 0; y < bitmap.Height; y++)
            //    {
            //        for (int x = 0; x < bitmap.Width; x++)
            //        {
            //            // draws image
            //            System.Drawing.Color color = System.Drawing.Color.FromArgb(result[y, x].a, result[y, x].b, result[y, x].c);
            //            resultImage.SetPixel(x, y, color);
            //        }
            //    }
            //    resultImage.Save(outputFile);
        }
コード例 #3
0
        /// <summary>
        /// fixed sampling scheme 4:2:0, colorPattern not considered
        /// </summary>
        /// <param name="inputCompression"></param>
        /// <returns></returns>
        public Color[,] LocalAveraging(int inputCompression)
        {
            Color[,] outputArray2D;
            outputArray2D = new Color[pixelMaxY, pixelMaxX];
            //Konstrukt befüllt die Ausgabe mit Color1 Werten (Y-Farbe)
            for (int y = 0; y < pixelMaxY; y++)
            {
                for (int x = 0; x < pixelMaxX; x++)
                {
                    outputArray2D[y, x] = inputArray2D[y, x].ConvertToColor1();
                }
            }

            //Alle Werte auf der x-Achse werden abhängig der Kompression in den ersten Pixel des Intervalls gespeichert
            Color3[,] tempArray;
            tempArray = new Color3[pixelMaxX, pixelMaxY];
            for(int y = 0; y< pixelMaxY; y++)
            {
                for(int x = 0; x<pixelMaxX; x = x+inputCompression)
                {
                    int count = 0;//Schrittzähler um bei ungerader Auflösung korrekte Mittelung zu erhalten
                    for (int z = x; z<x+inputCompression; z++)
                    {
                        if (z > pixelMaxX) break;
                        else
                        {
                            tempArray[y, x].Color3AdditionB(inputArray2D[y, z]);
                            //outputArray2D[y, x].b += inputArray2D[y, z].b;
                            tempArray[y, x].Color3AdditionC(inputArray2D[y, z]);
                            // outputArray2D[y, x].c += inputArray2D[y, z].c;

                        }
                        count++;
                    }
                    tempArray[y, x].Color3DivisionB(count);
                    tempArray[y, x].Color3DivisionC(count);
                    //outputArray2D[y, x].c = (byte) (outputArray2D[y, x].c / count);

                }
            }

            //Alle Werte in y-Richtung, abhänig der Kompression werden in den ersten Pixel gespeichert
            for (int y = 0; y<pixelMaxY; y= y+ inputCompression)
            {
                for(int x = 0; x<pixelMaxX; x = x+inputCompression)
                {
                    int count = 0;
                    for(int z = y+1; z< y+inputCompression; z++)
                    {
                        if (z > pixelMaxY) break;
                        else
                        {
                            tempArray[y, x].Color3AdditionB(tempArray[z, x]);
                            tempArray[y, x].Color3AdditionC(tempArray[z, x]);
                            //outputArray2D[y, x].b += outputArray2D[z, x].b;
                            //outputArray2D[y, x].c += outputArray2D[z, x].c;

                        }
                        count++;
                    }
                    //outputArray2D[y, x].b = (byte) (outputArray2D[y, x].b / count);
                    //outputArray2D[y, x].c = (byte) (outputArray2D[y, x].c / count);

                    tempArray[y, x].Color3DivisionB(count);
                    tempArray[y, x].Color3DivisionC(count);
                    tempArray[y, x].a = inputArray2D[y, x].a;
                    outputArray2D[y, x] = tempArray[y, x];
                }
            }

            return outputArray2D;

            //alle 1Vector Koordinaten
            //for (int y = 0; y < pixelMaxY;y= y+inputCompression)
            //{
            //    for (int x = 0; x < pixelMaxX; x=x + inputCompression)
            //    {
            //        outputArray2D[y, x].b = inputArray2D[y, x].b;
            //        outputArray2D[y, x].c = inputArray2D[y, x].c;
            //    }
            //    }
            //return outputArray2D;
        }
コード例 #4
0
ファイル: Test.cs プロジェクト: Kundentelefon/JPEGEncode
        public bool testZickZackbyte()
        {
            byte[,] test = new byte[4, 6]
            {
                { 1, 2, 6, 7, 14, 15 }, { 3, 5, 8, 13, 16, 21 }, { 4, 9, 12, 17, 20, 22 }, { 10, 11, 18, 19, 23, 24 }
            };
            byte[,] test2 = new byte[4, 7]
            {
                { 1, 2, 6, 7, 14, 15, 22 }, { 3, 5, 8, 13, 16, 21, 23 }, { 4, 9, 12, 17, 20, 24, 27 },
                { 10, 11, 18, 19, 25, 26, 28 }
            };
            byte[,] test3 = new byte[5, 7]
            {
                { 1, 2, 6, 7, 15, 16, 25 }, { 3, 5, 8, 14, 17, 24, 26 }, { 4, 9, 13, 18, 23, 27, 32 },
                { 10, 12, 19, 22, 28, 31, 33 }, { 11, 20, 21, 29, 30, 34, 35 }
            };
            byte[,] test4 = new byte[5, 6]
            {
                { 1, 2, 6, 7, 15, 16 }, { 3, 5, 8, 14, 17, 24 }, { 4, 9, 13, 18, 23, 25 }, { 10, 12, 19, 22, 26, 29 },
                { 11, 20, 21, 27, 28, 30 }
            };

            byte[,] test5 = new byte[6, 4]
            {
                { 1, 2, 6, 7 }, { 3, 5, 8, 14 }, { 4, 9, 13, 15 }, { 10, 12, 16, 21 }, { 11, 17, 20, 22 }, { 18, 19, 23, 24 }
            };
            byte[,] test6 = new byte[7, 6]
            {
                { 1, 2, 6, 7, 15, 16 }, { 3, 5, 8, 14, 17, 27 }, { 4, 9, 13, 18, 26, 28 }, { 10, 12, 19, 25, 29, 36 },
                { 11, 20, 24, 30, 35, 37 }, { 21, 23, 31, 34, 38, 41 }, { 22, 32, 33, 39, 40, 42 }
            };
            byte[,] test7 = new byte[7, 5]
            {
                { 1, 2, 6, 7, 15 }, { 3, 5, 8, 14, 16 }, { 4, 9, 13, 17, 25 }, { 10, 12, 18, 24, 26 }, { 11, 19, 23, 27, 32 },
                { 20, 22, 28, 31, 33 }, { 21, 29, 30, 34, 35 }
            };
            byte[,] test8 = new byte[6, 5]
            {
                { 1, 2, 6, 7, 15 }, { 3, 5, 8, 14, 16 }, { 4, 9, 13, 17, 24 }, { 10, 12, 18, 23, 25 }, { 11, 19, 22, 26, 29 },
                { 20, 21, 27, 28, 30 }
            };


            byte[] restest  = new byte[24];
            byte[] restest2 = new byte[28];
            byte[] restest3 = new byte[35];
            byte[] restest4 = new byte[30];
            for (byte i = 0; i < 24; i++)
            {
                restest[i] = (byte)(i + 1);
            }
            for (byte i = 0; i < 28; i++)
            {
                restest2[i] = (byte)(i + 1);
            }
            for (byte i = 0; i < 35; i++)
            {
                restest3[i] = (byte)(i + 1);
            }
            for (byte i = 0; i < 30; i++)
            {
                restest4[i] = (byte)(i + 1);
            }
            var result1 = false;
            var res     = testmath.ZickZackScanByte(test);
            var res2    = testmath.ZickZackScanByte(test2);
            var res3    = testmath.ZickZackScanByte(test3);
            var res4    = testmath.ZickZackScanByte(test4);

            if (res.SequenceEqual(restest) && res2.SequenceEqual(restest2) && res3.SequenceEqual(restest3) &&
                res4.SequenceEqual(restest4))
            {
                result1 = true;
            }

            byte[] restest5 = new byte[24];
            byte[] restest6 = new byte[42];
            byte[] restest7 = new byte[35];
            byte[] restest8 = new byte[30];
            for (byte i = 0; i < 24; i++)
            {
                restest5[i] = (byte)(i + 1);
            }
            for (byte i = 0; i < 42; i++)
            {
                restest6[i] = (byte)(i + 1);
            }
            for (byte i = 0; i < 35; i++)
            {
                restest7[i] = (byte)(i + 1);
            }
            for (byte i = 0; i < 30; i++)
            {
                restest8[i] = (byte)(i + 1);
            }
            var result2 = false;
            //passt
            var res5 = testmath.ZickZackScanByte(test5);
            var res6 = testmath.ZickZackScanByte(test6);
            var res7 = testmath.ZickZackScanByte(test7);
            var res8 = testmath.ZickZackScanByte(test8);

            if (res5.SequenceEqual(restest5) && res6.SequenceEqual(restest6) && res7.SequenceEqual(restest7) &&
                res8.SequenceEqual(restest8))
            {
                result2 = true;
            }
            if (result1 && result2)
            {
                return(true);
            }
            return(false);


            //Color example
            Color[] Colortest = new Color[10];
            Color3  col3      = new Color3();
            Color1  col1      = new Color1();

            Colortest[1] = col3;
            Colortest[2] = col1;
        }
コード例 #5
0
        /// <summary>
        /// fixed sampling scheme 4:2:0, colorPattern not considered
        /// </summary>
        /// <param name="inputCompression"></param>
        /// <returns></returns>
        public Color[,] LocalAveraging(int inputCompression)
        {
            Color[,] outputArray2D;
            outputArray2D = new Color[pixelMaxY, pixelMaxX];
            //Konstrukt befüllt die Ausgabe mit Color1 Werten (Y-Farbe)
            for (int y = 0; y < pixelMaxY; y++)
            {
                for (int x = 0; x < pixelMaxX; x++)
                {
                    outputArray2D[y, x] = inputArray2D[y, x].ConvertToColor1();
                }
            }

            //Alle Werte auf der x-Achse werden abhängig der Kompression in den ersten Pixel des Intervalls gespeichert
            Color3[,] tempArray;
            tempArray = new Color3[pixelMaxX, pixelMaxY];
            for (int y = 0; y < pixelMaxY; y++)
            {
                for (int x = 0; x < pixelMaxX; x = x + inputCompression)
                {
                    int count = 0;//Schrittzähler um bei ungerader Auflösung korrekte Mittelung zu erhalten
                    for (int z = x; z < x + inputCompression; z++)
                    {
                        if (z > pixelMaxX)
                        {
                            break;
                        }
                        else
                        {
                            tempArray[y, x].Color3AdditionB(inputArray2D[y, z]);
                            //outputArray2D[y, x].b += inputArray2D[y, z].b;
                            tempArray[y, x].Color3AdditionC(inputArray2D[y, z]);
                            // outputArray2D[y, x].c += inputArray2D[y, z].c;
                        }
                        count++;
                    }
                    tempArray[y, x].Color3DivisionB(count);
                    tempArray[y, x].Color3DivisionC(count);
                    //outputArray2D[y, x].c = (byte) (outputArray2D[y, x].c / count);
                }
            }

            //Alle Werte in y-Richtung, abhänig der Kompression werden in den ersten Pixel gespeichert
            for (int y = 0; y < pixelMaxY; y = y + inputCompression)
            {
                for (int x = 0; x < pixelMaxX; x = x + inputCompression)
                {
                    int count = 0;
                    for (int z = y + 1; z < y + inputCompression; z++)
                    {
                        if (z > pixelMaxY)
                        {
                            break;
                        }
                        else
                        {
                            tempArray[y, x].Color3AdditionB(tempArray[z, x]);
                            tempArray[y, x].Color3AdditionC(tempArray[z, x]);
                            //outputArray2D[y, x].b += outputArray2D[z, x].b;
                            //outputArray2D[y, x].c += outputArray2D[z, x].c;
                        }
                        count++;
                    }
                    //outputArray2D[y, x].b = (byte) (outputArray2D[y, x].b / count);
                    //outputArray2D[y, x].c = (byte) (outputArray2D[y, x].c / count);

                    tempArray[y, x].Color3DivisionB(count);
                    tempArray[y, x].Color3DivisionC(count);
                    tempArray[y, x].a   = inputArray2D[y, x].a;
                    outputArray2D[y, x] = tempArray[y, x];
                }
            }

            return(outputArray2D);

            //alle 1Vector Koordinaten
            //for (int y = 0; y < pixelMaxY;y= y+inputCompression)
            //{
            //    for (int x = 0; x < pixelMaxX; x=x + inputCompression)
            //    {
            //        outputArray2D[y, x].b = inputArray2D[y, x].b;
            //        outputArray2D[y, x].c = inputArray2D[y, x].c;
            //    }
            //    }
            //return outputArray2D;
        }
コード例 #6
0
        public void PPMtoJpg(string imageSrc, string imagedest)
        {
            Bitstream         bs  = new Bitstream();
            PlainFormatReader pfr = new PlainFormatReader(imageSrc);
            Mathloc           ml  = new Mathloc();
            Picture           pic = pfr.ReadPicture();

            int height = pic.Head.pixelMaxY;
            int width  = pic.Head.pixelMaxX;

            Color3[,] col3 = new Color3[height, width];
            byte[] colors = new byte[3];

            //convert RGB to YUV for each pixel
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    col3[y, x]   = pic.Data.PictureYX[y, x];
                    colors[0]    = col3[y, x].a; // R
                    colors[1]    = col3[y, x].b; // G
                    colors[2]    = col3[y, x].c; // B
                    colors       = ml.RGBToYUV(colors);
                    col3[y, x].a = colors[0];    // Y
                    col3[y, x].b = colors[1];    // U
                    col3[y, x].c = colors[2];    // V
                }
            }

            //convert float array to byte array
            float[,] yArray = new float[width, height]; // width and height vertauscht
            float[,] uArray = new float[width, height];
            float[,] vArray = new float[width, height];

            for (int j = 0; j < height; j++)
            {
                for (int i = 0; i < width; i++)
                {
                    yArray[i, j] = (float)col3[j, i].a;
                    uArray[i, j] = (float)col3[j, i].b;
                    vArray[i, j] = (float)col3[j, i].c;
                }
            }

            byte[,] yArrayEnde = new byte[width, height];
            byte[,] uArrayEnde = new byte[width, height];
            byte[,] vArrayEnde = new byte[width, height];

            //get float [number of 8x8][8x8]
            var yarry = aufteilen(yArray);
            var uarry = aufteilen(uArray);
            var varry = aufteilen(vArray);


            //geht beim 40x40 bild 25
            for (int y = 0; y < height / 8; y++)
            {
                for (int x = 0; x < width / 8; x++)
                {
                    //DCTDirect
                    for (int i = 0; i < ((height * width) / 64); i++)
                    {
                        yArray = DCT.DCTdirect(yarry[i]);
                        uArray = DCT.DCTdirect(uarry[i]);
                        vArray = DCT.DCTdirect(varry[i]);
                    }

                    //convert float array to byte array
                    byte[,] yArrayB = new byte[width, height];
                    byte[,] uArrayB = new byte[width, height];
                    byte[,] vArrayB = new byte[width, height];

                    for (int i = 0; i < width / 8; i++)
                    {
                        for (int j = 0; j < height / 8; j++)
                        {
                            yArrayB[i, j] = (byte)yArray[i, j];
                            uArrayB[i, j] = (byte)uArray[i, j];
                            vArrayB[i, j] = (byte)vArray[i, j];
                        }
                    }

                    for (int i = 0; i < 8; i++)
                    {
                        for (int j = 0; j < 8; j++)
                        {
                            yArrayEnde[i * x, j *y] = yArrayB[i, j];
                            uArrayEnde[i * x, j *y] = uArrayB[i, j];
                            vArrayEnde[i * x, j *y] = vArrayB[i, j];
                        }
                    }


                    byte[] yArrayB2 = new byte[64];
                    byte[] uArrayB2 = new byte[64];
                    byte[] vArrayB2 = new byte[64];

                    for (int i = 0; i < 8; i++)
                    {
                        for (int j = 0; j < 8; j++)
                        {
                            yArrayB2[ZigZagTable2[i * j]] = yArrayB[i, j];
                            uArrayB2[ZigZagTable2[i * j]] = uArrayB[i, j];
                            vArrayB2[ZigZagTable2[i * j]] = vArrayB[i, j];
                        }
                    }



                    // Create Huffmantables
                    //yArrayEnde = HuffmanCalc(YDCNodes, YDCValues, yArrayB2);
                    //yArrayEnde = HuffmanCalc(YDCNodes, YACValues, yArrayB2);

                    //uArrayEnde = HuffmanCalc(CbDCNodes, CbDCValues, uArrayB2);
                    //uArrayEnde = HuffmanCalc(CbACNodes, CbACValues, uArrayB2);

                    //vArrayEnde = HuffmanCalc(CbDCNodes, CbDCValues, vArrayB2);
                    //vArrayEnde = HuffmanCalc(CbACNodes, CbACValues, vArrayB2);
                }
            }


            //create JPG head
            PictureHead.CreateJPGHead(bs, (ushort)height, (ushort)width);


            //TODO: DCT
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    bs.AddByte((byte)yArrayEnde[x, y]);
                    bs.AddByte((byte)uArrayEnde[x, y]);
                    bs.AddByte((byte)vArrayEnde[x, y]);
                }
            }

            bs.AddShort(0xffd9); //End of Picture Marker
            bs.WriteToFile(imagedest);
        }
コード例 #7
0
ファイル: Test.cs プロジェクト: Kundentelefon/JPEGEncode
        public bool testZickZackbyte()
        {
            byte[,] test = new byte[4, 6]
            {{1, 2, 6, 7, 14, 15}, {3, 5, 8, 13, 16, 21}, {4, 9, 12, 17, 20, 22}, {10, 11, 18, 19, 23, 24}};
            byte[,] test2 = new byte[4, 7]
            {
                {1, 2, 6, 7, 14, 15, 22}, {3, 5, 8, 13, 16, 21, 23}, {4, 9, 12, 17, 20, 24, 27},
                {10, 11, 18, 19, 25, 26, 28}
            };
            byte[,] test3 = new byte[5, 7]
            {
                {1, 2, 6, 7, 15, 16, 25}, {3, 5, 8, 14, 17, 24, 26}, {4, 9, 13, 18, 23, 27, 32},
                {10, 12, 19, 22, 28, 31, 33}, {11, 20, 21, 29, 30, 34, 35}
            };
            byte[,] test4 = new byte[5, 6]
            {
                {1, 2, 6, 7, 15, 16}, {3, 5, 8, 14, 17, 24}, {4, 9, 13, 18, 23, 25}, {10, 12, 19, 22, 26, 29},
                {11, 20, 21, 27, 28, 30}
            };

            byte[,] test5 = new byte[6, 4]
            {{1, 2, 6, 7}, {3, 5, 8, 14}, {4, 9, 13, 15}, {10, 12, 16, 21}, {11, 17, 20, 22}, {18, 19, 23, 24}};
            byte[,] test6 = new byte[7, 6]
            {
                {1, 2, 6, 7, 15, 16}, {3, 5, 8, 14, 17, 27}, {4, 9, 13, 18, 26, 28}, {10, 12, 19, 25, 29, 36},
                {11, 20, 24, 30, 35, 37}, {21, 23, 31, 34, 38, 41}, {22, 32, 33, 39, 40, 42}
            };
            byte[,] test7 = new byte[7, 5]
            {
                {1, 2, 6, 7, 15}, {3, 5, 8, 14, 16}, {4, 9, 13, 17, 25}, {10, 12, 18, 24, 26}, {11, 19, 23, 27, 32},
                {20, 22, 28, 31, 33}, {21, 29, 30, 34, 35}
            };
            byte[,] test8 = new byte[6, 5]
            {
                {1, 2, 6, 7, 15}, {3, 5, 8, 14, 16}, {4, 9, 13, 17, 24}, {10, 12, 18, 23, 25}, {11, 19, 22, 26, 29},
                {20, 21, 27, 28, 30}
            };

            byte[] restest = new byte[24];
            byte[] restest2 = new byte[28];
            byte[] restest3 = new byte[35];
            byte[] restest4 = new byte[30];
            for (byte i = 0; i < 24; i++)
            {
                restest[i] = (byte) (i + 1);
            }
            for (byte i = 0; i < 28; i++)
            {
                restest2[i] = (byte) (i + 1);
            }
            for (byte i = 0; i < 35; i++)
            {
                restest3[i] = (byte) (i + 1);
            }
            for (byte i = 0; i < 30; i++)
            {
                restest4[i] = (byte) (i + 1);
            }
            var result1 = false;
            var res = testmath.ZickZackScanByte(test);
            var res2 = testmath.ZickZackScanByte(test2);
            var res3 = testmath.ZickZackScanByte(test3);
            var res4 = testmath.ZickZackScanByte(test4);
            if (res.SequenceEqual(restest) && res2.SequenceEqual(restest2) && res3.SequenceEqual(restest3) &&
                res4.SequenceEqual(restest4))
            {
                result1 = true;
            }

            byte[] restest5 = new byte[24];
            byte[] restest6 = new byte[42];
            byte[] restest7 = new byte[35];
            byte[] restest8 = new byte[30];
            for (byte i = 0; i < 24; i++)
            {
                restest5[i] = (byte) (i + 1);
            }
            for (byte i = 0; i < 42; i++)
            {
                restest6[i] = (byte) (i + 1);
            }
            for (byte i = 0; i < 35; i++)
            {
                restest7[i] = (byte) (i + 1);
            }
            for (byte i = 0; i < 30; i++)
            {
                restest8[i] = (byte) (i + 1);
            }
            var result2 = false;
            //passt
            var res5 = testmath.ZickZackScanByte(test5);
            var res6 = testmath.ZickZackScanByte(test6);
            var res7 = testmath.ZickZackScanByte(test7);
            var res8 = testmath.ZickZackScanByte(test8);
            if (res5.SequenceEqual(restest5) && res6.SequenceEqual(restest6) && res7.SequenceEqual(restest7) &&
                res8.SequenceEqual(restest8))
            {
                result2 = true;
            }
            if (result1 && result2)
            {
                return (true);
            }
            return (false);

            //Color example
            Color[] Colortest = new Color[10];
            Color3 col3 = new Color3();
            Color1 col1 = new Color1();

            Colortest[1] = col3;
            Colortest[2] = col1;
        }
コード例 #8
0
        public void PPMtoJpg(string imageSrc, string imagedest)
        {
            Bitstream bs = new Bitstream();
            PlainFormatReader pfr = new PlainFormatReader(imageSrc);
            Mathloc ml = new Mathloc();
            Picture pic = pfr.ReadPicture();

            int height = pic.Head.pixelMaxY;
            int width = pic.Head.pixelMaxX;

            Color3[,] col3 = new Color3[height,width];
            byte[] colors = new byte[3];

            //convert RGB to YUV for each pixel
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    col3[y, x] = pic.Data.PictureYX[y, x];
                    colors[0] = col3[y, x].a; // R
                    colors[1] = col3[y, x].b; // G
                    colors[2] = col3[y, x].c; // B
                    colors = ml.RGBToYUV(colors);
                    col3[y, x].a = colors[0]; // Y
                    col3[y, x].b = colors[1]; // U
                    col3[y, x].c = colors[2]; // V
                }
            }

            //convert float array to byte array
            float[,] yArray = new float[width, height]; // width and height vertauscht
            float[,] uArray = new float[width, height];
            float[,] vArray = new float[width, height];

            for (int j = 0; j < height; j++)
            {
                for (int i = 0; i < width; i++)
                {
                    yArray[i, j] = (float)col3[j, i].a;
                    uArray[i, j] = (float)col3[j, i].b;
                    vArray[i, j] = (float)col3[j, i].c;
                }
            }

            byte[,] yArrayEnde = new byte[width, height];
            byte[,] uArrayEnde = new byte[width, height];
            byte[,] vArrayEnde = new byte[width, height];

            //get float [number of 8x8][8x8]
            var yarry = aufteilen(yArray);
            var uarry = aufteilen(uArray);
            var varry = aufteilen(vArray);

            //geht beim 40x40 bild 25
            for (int y = 0; y < height/8; y ++)
            {
                for (int x = 0; x < width/8; x ++)
                {

            //DCTDirect
            for (int i = 0; i < ((height * width) / 64); i++)
            {
                yArray = DCT.DCTdirect(yarry[i]);
                uArray = DCT.DCTdirect(uarry[i]);
                vArray = DCT.DCTdirect(varry[i]);
            }

            //convert float array to byte array
            byte[,] yArrayB = new byte[width, height];
            byte[,] uArrayB = new byte[width, height];
            byte[,] vArrayB = new byte[width, height];

            for (int i = 0; i < width/8; i++)
            {
                for (int j = 0; j < height/8; j++)
                {
                    yArrayB[i, j] = (byte)yArray[i, j];
                    uArrayB[i, j] = (byte)uArray[i, j];
                    vArrayB[i, j] = (byte)vArray[i, j];
                }
            }

                    for (int i = 0; i < 8; i++)
                    {
                        for (int j = 0; j < 8; j++)
                        {
                            yArrayEnde[i * x, j * y] = yArrayB[i, j];
                            uArrayEnde[i * x, j * y] = uArrayB[i, j];
                            vArrayEnde[i * x, j  *y] = vArrayB[i, j];
                        }
                    }

                    byte[] yArrayB2 = new byte[64];
            byte[] uArrayB2 = new byte[64];
            byte[] vArrayB2 = new byte[64];

            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                yArrayB2[ZigZagTable2[i*j]] = yArrayB[i, j];
                uArrayB2[ZigZagTable2[i*j]] = uArrayB[i, j];
                vArrayB2[ZigZagTable2[i*j]] = vArrayB[i, j];
                }
            }

                    // Create Huffmantables
                    //yArrayEnde = HuffmanCalc(YDCNodes, YDCValues, yArrayB2);
                    //yArrayEnde = HuffmanCalc(YDCNodes, YACValues, yArrayB2);

                    //uArrayEnde = HuffmanCalc(CbDCNodes, CbDCValues, uArrayB2);
                    //uArrayEnde = HuffmanCalc(CbACNodes, CbACValues, uArrayB2);

                    //vArrayEnde = HuffmanCalc(CbDCNodes, CbDCValues, vArrayB2);
                    //vArrayEnde = HuffmanCalc(CbACNodes, CbACValues, vArrayB2);

                }
            }

            //create JPG head
            PictureHead.CreateJPGHead(bs, (ushort)height, (ushort)width);

            //TODO: DCT
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    bs.AddByte((byte)yArrayEnde[x, y]);
                    bs.AddByte((byte)uArrayEnde[x, y]);
                    bs.AddByte((byte)vArrayEnde[x, y]);
                }
            }

            bs.AddShort(0xffd9); //End of Picture Marker
            bs.WriteToFile(imagedest);
        }
コード例 #9
0
 public void Color3AdditionC(Color3 inputColor)
 {
     c += inputColor.c;
 }
コード例 #10
0
ファイル: Test.cs プロジェクト: Kundentelefon/JPEGEncode
        //Bitmap test
        public void TestChannelResolutionReduction(string inputFile, string outputFile)
        {
            // load Bitmap .png
            Bitmap bitmap = new Bitmap(inputFile);
            Color[,] picture = new Color[bitmap.Height, bitmap.Width];
            for (int x = 0; x < bitmap.Width; x++)
            {
                for (int y = 0; y < bitmap.Height; y++)
                {
                    var bitmapPixel = bitmap.GetPixel(x, y);
                    // sets RGB for each pixel
                    Color3 newPixel = new Color3
                    {
                        a = bitmapPixel.R,
                        b = bitmapPixel.G,
                        c = bitmapPixel.B
                    };
                    picture[y, x] = newPixel;
                }
            }

            //    CompressionHandler compressionHandler = new CompressionHandler(picture, bitmap.Width, bitmap.Height);

            //    // compressionhandler dont neednead parameter yet
            //    Color[,] result = compressionHandler.LocalAveraging444To422(0xDEAD);

            //    Bitmap resultImage = new Bitmap(bitmap.Width, bitmap.Height);
            //    for (int y = 0; y < bitmap.Height; y++)
            //    {
            //        for (int x = 0; x < bitmap.Width; x++)
            //        {
            //            // draws image
            //            System.Drawing.Color color = System.Drawing.Color.FromArgb(result[y, x].a, result[y, x].b, result[y, x].c);
            //            resultImage.SetPixel(x, y, color);
            //        }
            //    }
            //    resultImage.Save(outputFile);
        }
コード例 #11
0
 public void Color3AdditionB(Color3 inputColor)
 {
     b += inputColor.b;
 }
コード例 #12
0
 public void Color3AdditionA(Color3 inputColor)
 {
     a += inputColor.a;
 }
コード例 #13
0
ファイル: Color3.cs プロジェクト: Kundentelefon/JPEGEncode
 public void Color3AdditionC(Color3 inputColor)
 {
     c += inputColor.c;
 }
コード例 #14
0
ファイル: Color3.cs プロジェクト: Kundentelefon/JPEGEncode
 public void Color3AdditionB(Color3 inputColor)
 {
     b += inputColor.b;
 }
コード例 #15
0
ファイル: Color3.cs プロジェクト: Kundentelefon/JPEGEncode
 public void Color3AdditionA(Color3 inputColor)
 {
     a += inputColor.a;
 }