Przetwarzanie obrazów

0

Witam.
Mam problem z przetwarzaniem obrazów innych niż RGB8.
Ten fragment kodu odpowiada za czytanie obrazków z bazy i zapisywanie na dysku:

using (SqlDataReader dr = new SqlCommand(sql, DB).ExecuteReader())
                    		{
                        while (dr.Read())
                        {
                            Console.WriteLine(dr[1].ToString());
                            
                            byte[] b = (byte[])dr[0];
                            Image i = Ih.ByteArrayToImage(b);
                            i.Save(output + dr[1].ToString());
                            if (minMaxSize > 0)
                            {
                                String smallName = output + "small_" + dr[1].ToString();
                                Console.Write("creating small image "+smallName );
                                Image i2 = Ih.ResizeToSquare(i, minMaxSize);
                                i2.Save(smallName, i.RawFormat);
                                Console.WriteLine(": done");
                            }
                        }
                    }

Jeśli pliki są np. RGB16 to wywala się na Image i = Ih.ByteArrayToImage(b);

public Image ByteArrayToImage(byte[] byteArrayIn)
        {
            try
            {
                MemoryStream ms = new MemoryStream(byteArrayIn);
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
            catch (Exception ex) {
                return null;
            }
        }

i wywala error:

System.ArgumentException: Parametr jest nieprawidłowy.
   w System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
   w System.Drawing.Image.FromStream(Stream stream)

Ale to jest moje najmniejsze zmartwienie. Schody zaczynają się podczas skalowania obrazków, które nie są RGB (np. Greyscale).
Metoda skalująca:

public Image ResizeToSquare(Image image, int newSize)
        {
            int x, y;
            int newX, newY;
            x = image.Width;
            y = image.Height;
            newX = x;
            newY = y;
            if (x < y)
            { //trzeba powiekszyc
                newX = newSize;
                Double scale = Convert.ToDouble(newX) / Convert.ToDouble(x);
                newY = (int)(Convert.ToDouble(y) * scale);
            }
            else
            {
                newY = newSize;
                Double scale = Convert.ToDouble(newY) / Convert.ToDouble(y);
                newX = (int)(Convert.ToDouble(x) * scale);
            }
            Graphics gr = Graphics.FromImage(image); 
            Bitmap newImg = new Bitmap(newX, newY);
            Graphics.FromImage(newImg).DrawImage(image, 0, 0, newX, newY);
            return newImg;
        }

W linijce Graphics gr = Graphics.FromImage(image); wywala mi error:

System.Exception: Obiekt Graphics nie może zostać utworzony z obrazu, który ma format piksela indeksowanego.
   w System.Drawing.Graphics.FromImage(Image image)
   w Bowling.ImageHelper.ResizeToSquare(Image image, Int32 newSize)

Ma ktoś jakiś pomysł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1