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ł?