예제 #1
0
        public ActionResult DeleteConfirmed(int id)
        {
            Images images = db.ImagesSet.Find(id);

            if (images == null || images.Pools.owner != User.Identity.Name)
            {
                return(HttpNotFound());
            }

            Pools thisPool  = db.PoolsSet.Find(images.PoolsId);
            bool  writelock = false;

            // Wenn der Pool ein MotivPool ist (und das Bild ein Motiv ist) gibt es einen spezifischen Writelock
            if (thisPool.size == 0)
            {
                writelock = db.Set <Motive>().Find(id).writelock;
            }

            if (!thisPool.writelock && !writelock)
            {
                // Speichere die Änderungen in der Datenbank
                db.ImagesSet.Remove(images);
                db.SaveChanges();

                // Entferne das Bild im FileSystem
                System.IO.File.Delete(IMAGEPATH + images.path + images.filename);

                return(RedirectToAction("Details", "Pools", new { id = images.PoolsId }));
            }
            return(RedirectToAction("Delete", "Pools", new { id = images.PoolsId }));
        }
예제 #2
0
        /// <summary>
        /// Erstellt eine Kachel
        /// </summary>
        /// <param name="kachelPoolID">Der Pool in dem die Kachel gespeichert werden soll</param>
        /// <param name="r">Der Rot-Anteil der Kachelfarbe</param>
        /// <param name="g">Der Grün-Anteil der Kachelfarbe</param>
        /// <param name="b">Der Blau-Anteil der Kachelfarbe</param>
        /// <param name="nois">Es kann ein Rauschen der Farbwerte erzeugt werden</param>
        /// <returns>Void</returns>
        public void genKachel(int kachelPoolID, int r, int g, int b, bool nois = false)
        {
            int nr = r;
            int ng = g;
            int nb = b;
            int boul;
            int rand;

            printToConsole("Find pool by Id: " + kachelPoolID, ConsolePrintTypes.INFO);
            Pools kachelPool = db.PoolsSet.Where(p => p.Id == kachelPoolID).First();

            printToConsole("R: " + r + "G: " + g + "B: " + b + "Nois: " + nois, ConsolePrintTypes.INFO);

            printToConsole("Kachelsize " + kachelPool.size + "x" + kachelPool.size, ConsolePrintTypes.INFO);
            int width  = kachelPool.size;
            int height = kachelPool.size;

            Random random = new Random();
            Bitmap bitmap = new Bitmap(width, height);

            try {
                for (int x = 0; x < width; x++)
                {
                    for (int y = 0; y < height; y++)
                    {
                        if (nois)
                        {
                            boul = random.Next(0, 1);
                            rand = random.Next(50, 70);

                            if (boul == 1)
                            {
                                nr = r + rand;
                                ng = g + rand;
                                nb = b + rand;
                            }
                            else
                            {
                                nr = r - rand;
                                ng = g - rand;
                                nb = b - rand;
                            }

                            nr = minMax(nr);
                            ng = minMax(ng);
                            nb = minMax(nb);
                        }
                        bitmap.SetPixel(x, y, Color.FromArgb(nr, ng, nb));
                    }
                }
            }
            catch (Exception e)
            {
                printToConsole(e.ToString(), ConsolePrintTypes.INFO);
            }

            // Generiere eine Einzigartige Bezeichnung
            String UUID = Guid.NewGuid().ToString();

            printToConsole("gen UUID: " + UUID, ConsolePrintTypes.INFO);

            // Speichere das Bild ab
            bitmap.Save(IMAGEPATH + "Kacheln\\" + UUID + ".png");
            printToConsole("Save image to: " + IMAGEPATH + "Kacheln\\" + UUID + ".png", ConsolePrintTypes.INFO);

            var kachel = db.Set <Kacheln>();

            kachel.Add(new Kacheln
            {
                displayname = "Kachel",
                filename    = UUID + ".png",
                path        = "Kacheln\\",
                heigth      = bitmap.Size.Height,
                width       = bitmap.Size.Width,
                hsv         = "000",
                PoolsId     = kachelPoolID,
                avgR        = (int)colorValue(bitmap, ColorType.RED),
                avgG        = (int)colorValue(bitmap, ColorType.GREEN),
                avgB        = (int)colorValue(bitmap, ColorType.BLUE)
            });

            // Speichere die DB
            db.SaveChanges();
            printToConsole("Generation done!", ConsolePrintTypes.INFO);

            bitmap.Dispose();
        }
예제 #3
0
 public Repository(DBModelContainer context)
 {
     _context = context;
     dbSet    = _context.Set <T>();
 }
예제 #4
0
        /// <summary>
        /// Der eigentliche Mosaikgenerator. Liest Kacheln aus und fuegt diese an die passenden Stellen fuer das Originalbild ein
        /// </summary>
        /// <param name="basisMotivID">Die ID des Basismotivs</param>
        /// <param name="kachelPoolID">Die ID des Kachelpools</param>
        /// <param name="mosaikPoolID">Die ID des Mosaikpools (in dem das Bild gespeichert wird)</param>
        /// <param name="kachelnMultiUseEnabled">Sollen Kacheln mehrfach genutzt werden duerfen?</param>
        /// <param name="auswahlNBesteKacheln">Aus wievielen der besten Bilder soll ein zufaelliges ausgewaehlt werden?</param>
        public bool mosaikGenerator(int basisMotivID, int kachelPoolID, int mosaikPoolID, Boolean kachelnMultiUseEnabled = true, int auswahlNBesteKacheln = 1)
        {
            printToConsole("MosaikStart! (" + basisMotivID + "--" + kachelPoolID + "--" + mosaikPoolID + "--" + auswahlNBesteKacheln + ")", ConsolePrintTypes.INFO);

            // Pruefe ob alle wichtigen Parameter richtig gesetzt sind
            if (basisMotivID < 1 && kachelPoolID < 1 && mosaikPoolID < 1 && auswahlNBesteKacheln < 1)
            {
                printToConsole("Falscher Parameter - Abbruch! (" + basisMotivID + "--" + kachelPoolID + "--" + mosaikPoolID + "--" + auswahlNBesteKacheln + ")", ConsolePrintTypes.ERROR);
                return(false);
            }

            // Lade das Basismotiv in eine Bitmap
            Bitmap basisMotiv = openImage(basisMotivID);

            // Wenn basisMotiv null ist dann gab es einen Fehler beim laden des Bildes
            if (basisMotiv == null)
            {
                printToConsole("Basismotiv nicht gefunden - Abbruch!", ConsolePrintTypes.ERROR);
                return(false);
            }

            // Lade die Kachel-Poolinformationen aus der Datenbank
            Pools kachelPool = db.PoolsSet.Find(kachelPoolID);

            // Berechne die Anzahl aller Pixel
            int pixel = basisMotiv.Height * basisMotiv.Width;

            // Prüfe ob genug Kacheln im Pool sind
            // Wenn Kacheln nur einmalig erlaubt sind, muss geprueft werden ob genug vorhanden sind
            if (!kachelnMultiUseEnabled)
            {
                // Wenn weniger Kacheln als Pixel vorhanden sind...
                if (db.ImagesSet.Count <Images>() < pixel)
                {
                    basisMotiv.Dispose();
                    printToConsole("Zu wenig Kacheln im Pool!", ConsolePrintTypes.ERROR);
                    return(false);
                }
            }

            // lege ein neues Bild mit der neuen Groesse an
            // Berechnung in der Dokumentation
            Bitmap mosaik = new Bitmap((basisMotiv.Size.Width * kachelPool.size), (basisMotiv.Size.Height * kachelPool.size));

            // Falls Kacheln nur einmalig genutzt werden duerfen, muessen diese vermerkt werden
            List <int> usedKacheln = new List <int>();

            // Es soll eine Liste vorhanden sein die aus den N besten Bildern ein zufaelliges auswaehlt
            Dictionary <int, double> nKacheln = new Dictionary <int, double>();

            // Hole alle Bilder aus dem Pool
            Kacheln[] poolBilder = db.ImagesSet.OfType <Kacheln>().Where(p => p.PoolsId == kachelPoolID).ToArray();

            // Lege die Variablen zur Berechnung an
            Color  pixelFarbe;
            Random rnd = new Random();
            Bitmap thisKachel;
            int    bestfit;
            int    differenzRot   = 0;
            int    differenzGruen = 0;
            int    differenzBlau  = 0;

            // gehe jeden einzelnen Pixel des Originalbildes durch
            for (int i = 1; i < basisMotiv.Size.Width + 1; i++)
            {
                for (int j = 1; j < basisMotiv.Size.Height + 1; j++)
                {
                    // Lade die Farbwerte des aktuellen Pixels
                    pixelFarbe = basisMotiv.GetPixel(i - 1, j - 1);

                    // Gehe jedes Bild im Pool durch und pruefe ob es gut dorthin passt
                    for (int k = 0; k < poolBilder.Length; k++)
                    {
                        // Wenn Kacheln Multi disabled ist & die Kachel schonmal
                        // genutzt wurde soll der folgende Teil ignoriert werden
                        if (kachelnMultiUseEnabled || (!kachelnMultiUseEnabled && !usedKacheln.Contains(poolBilder[k].Id)))
                        {
                            // Berechne die drei jeweiligen (positiven) Differenzen
                            if (poolBilder[k].avgR > pixelFarbe.R)
                            {
                                differenzRot = poolBilder[k].avgR - pixelFarbe.R;
                            }
                            else
                            {
                                differenzRot = pixelFarbe.R - poolBilder[k].avgR;
                            }

                            if (poolBilder[k].avgG > pixelFarbe.G)
                            {
                                differenzGruen = poolBilder[k].avgG - pixelFarbe.G;
                            }
                            else
                            {
                                differenzGruen = pixelFarbe.G - poolBilder[k].avgG;
                            }

                            if (poolBilder[k].avgB > pixelFarbe.B)
                            {
                                differenzBlau = poolBilder[k].avgB - pixelFarbe.B;
                            }
                            else
                            {
                                differenzBlau = pixelFarbe.B - poolBilder[k].avgB;
                            }

                            // Rechne den Farbabstand aus (Formel aus den Hinweisen zur Hausarbeit)
                            double farbAbstand = Math.Sqrt((double)(differenzRot * differenzRot) + (differenzGruen * differenzGruen) + (differenzBlau * differenzBlau));

                            // Wenn noch Platz in dem N-Kachel-Array ist, lege den Wert ab
                            if (auswahlNBesteKacheln > nKacheln.Count)
                            {
                                nKacheln.Add(poolBilder[k].Id, farbAbstand);
                            }
                            else
                            {
                                // Ermittle den schlechtesten Wert in den N-Kacheln
                                double schlechtesterWert = 0;
                                int    index             = -1;

                                // Gehe alle Elemente durch und finde den schlechtesten Wert
                                // Dieser muss GRÖSSER als die anderen sein, da der ABSTAND möglichst niedrig sein soll
                                foreach (var nKachel in nKacheln)
                                {
                                    if (nKachel.Value > schlechtesterWert)
                                    {
                                        index             = nKachel.Key;
                                        schlechtesterWert = nKachel.Value;
                                    }
                                }

                                // Wenn das ergebnis besser ist als der schlechteste Wert
                                if (farbAbstand < schlechtesterWert)
                                {
                                    // Entferne das schlechteste Element
                                    nKacheln.Remove(index);

                                    // Fuege die neue nKachel hinzu
                                    nKacheln.Add(poolBilder[k].Id, farbAbstand);
                                }
                            }
                        }
                    }

                    // Hier wurden alle Bilder im Pool für einen Pixel durchsucht
                    // Hole nur die Keys aus der Liste
                    List <int> keys = Enumerable.ToList(nKacheln.Keys);

                    // Waehle ein zufaelligen Key - und damit auch das einzusetzende Bild
                    bestfit = keys[rnd.Next(nKacheln.Count)];

                    // Bereinige die NKacheln damit sie beim nächsten durchlauf nicht nochmal vorkommen :D
                    nKacheln.Clear();

                    // Wenn Kacheln nur einmal genutzt werden sollen, muss diese Kachel gespeichert werden
                    if (!kachelnMultiUseEnabled)
                    {
                        usedKacheln.Add(bestfit);
                    }

                    // Lade die Kachel
                    thisKachel = openImage(bestfit);

                    // Wenn basisMotiv null ist dann gab es einen Fehler beim laden des Bildes
                    if (thisKachel == null)
                    {
                        printToConsole("Kachel (" + bestfit + ") nicht gefunden - Abbruch!", ConsolePrintTypes.ERROR);
                        return(false);
                    }

                    // Füge nun jeden einzelnen Pixel an seiner dafür vorgesehnen Position ein
                    for (int x = 0; x < kachelPool.size; x++)
                    {
                        for (int y = 0; y < kachelPool.size; y++)
                        {
                            // Lade die Farbwerte des aktuellen Pixels
                            pixelFarbe = thisKachel.GetPixel(x, y);

                            // Und Fuege in an die richtige Position im neuen Mosaikbild ein
                            mosaik.SetPixel((((i - 1) * kachelPool.size) + x), (((j - 1) * kachelPool.size) + y), pixelFarbe);
                        }
                    }
                }
            }

            // Generiere eine Einzigartige Bezeichnung
            String UUID = Guid.NewGuid().ToString();

            // Speichere das Bild ab
            mosaik.Save(IMAGEPATH + "Motive\\" + UUID + ".png");

            var image = db.Set <Motive>();

            image.Add(new Motive {
                displayname = "Mosaik", filename = UUID + ".png", path = "Motive\\", heigth = (basisMotiv.Size.Height * kachelPool.size), width = (basisMotiv.Size.Width * kachelPool.size), hsv = "000", PoolsId = mosaikPoolID, writelock = false
            });

            // Speichere die DB
            db.SaveChanges();

            return(true);
        }
예제 #5
0
        public ActionResult UploadImage(IEnumerable <HttpPostedFileBase> files, int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            Pools pools = db.PoolsSet.Find(id);

            if (pools == null || pools.owner != User.Identity.Name)
            {
                return(HttpNotFound());
            }

            ViewBag.Poolname = pools.name;
            ViewBag.isKachel = pools.size > 0;
            ViewBag.id       = id;

            String folder = "Kacheln";

            if (pools.size == 0)
            {
                folder = "Motive";
            }

            foreach (var file in files)
            {
                String UUID      = Guid.NewGuid().ToString();
                String extention = System.IO.Path.GetExtension(file.FileName);
                string filename  = UUID + extention;

                file.SaveAs(IMAGEPATH + folder + "\\" + filename);

                Bitmap bmp = new Bitmap(IMAGEPATH + folder + "\\" + filename);

                String dateiname  = file.FileName;
                int    fileExtPos = dateiname.LastIndexOf(".");
                if (fileExtPos >= 0)
                {
                    dateiname = dateiname.Substring(0, fileExtPos);
                }

                if (pools.size == 0)
                {
                    db.Set <Motive>().Add(new Motive {
                        path = folder + "\\", filename = filename, PoolsId = pools.Id, displayname = dateiname, heigth = bmp.Height, width = bmp.Width, hsv = "0", readlock = false, writelock = false
                    });
                }
                else
                {
                    db.Set <Kacheln>().Add(new Kacheln {
                        path = folder + "\\", filename = filename, PoolsId = pools.Id, displayname = dateiname, heigth = bmp.Height, width = bmp.Width, hsv = "0"
                    });                                                                                                                                                                              //, avgR = (int)red, avgG = (int)green, avgB = (int)blue });
                }
                db.SaveChanges();

                bmp.Dispose();

                // Croppen und Scalen wenn Bild eine Kachel ist
                if (pools.size > 0)
                {
                    EndpointAddress           endPoint       = new EndpointAddress("http://localhost:8080/mosaikgenerator/imagehandler");
                    ChannelFactory <IHandler> channelFactory = new ChannelFactory <IHandler>(new BasicHttpBinding(), endPoint);
                    IHandler proxy = null;

                    int imageId = db.ImagesSet.Where(p => p.filename == filename).First().Id;

                    try
                    {
                        proxy = channelFactory.CreateChannel();
                        proxy.cropRect(imageId);
                        proxy.scale(imageId, pools.size);
                    }
                    catch (Exception e)
                    {
                        channelFactory.Close();
                        Console.WriteLine(e.ToString());
                    }

                    channelFactory.Close();
                }
            }

            var imagesSet = db.ImagesSet.Include(p => p.Pools).Where(k => k.PoolsId == pools.Id);

            return(View(imagesSet.ToList()));
        }