НУЖНО ПОМОЩЬ. Обрезать изображение при потоковой передаче с IP-камеры - PullRequest
0 голосов
/ 07 ноября 2010

У меня есть система мониторинга, и я хочу сохранить снимок с камеры при срабатывании тревоги. Я перепробовал много способов сделать это ... и все работает нормально.

string ImageName = @"E:\snapshot\pic" + imageid + ".jpg";
WebClient webclient = new WebClient();
webclient.Credentials = new NetworkCredential("admin", "pass");
Uri url = new Uri("http://" + ip + "/cgi-bin/cmd/encoder?SNAPSHOT");
webclient.DownloadFileAsync(url, ImageName);
webclient.Dispose();

изображение с камеры (1280 * 1024). я хочу обрезать изображение, чтобы получить (500 * 500) пикселей

private void button2_Click(object sender, EventArgs e)
    {
        string ImageFrom = @"c:\3.jpg";
        byte[] imageData = ReadFile(ImageFrom);
        byte[] data = CropPicture(imageData, 500, 500);
        SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True");
        string qry = "insert into val (id,img) values (@OriginalPath, @ImageData)";
        SqlCommand SqlCom = new SqlCommand(qry, cn);
        SqlCom.Parameters.Add(new SqlParameter("@OriginalPath",(object)"123"));
        SqlCom.Parameters.Add(new SqlParameter("@ImageData", (object)data));
        cn.Open();
        SqlCom.ExecuteNonQuery();
    }
    byte[] ReadFile(string sPath)
    {
        byte[] data = null;
        FileInfo fInfo = new FileInfo(sPath);
        long numBytes = fInfo.Length;
        FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fStream);
        data = br.ReadBytes((int)numBytes);
        return data;
    }
    public static byte[] CropPicture(byte[] imgFile, int targetW, int targetH)
    {
        Image imgPhoto = Image.FromStream(new MemoryStream(imgFile));
        int targetX = (imgPhoto.Width - targetW) / 2;
        int targetY = (imgPhoto.Height - targetH) / 2;
        Bitmap bmpPhoto = new Bitmap(targetW, targetH, PixelFormat.Format24bppRgb);
        bmpPhoto.SetResolution(80, 60);
        Graphics gfxPhoto = Graphics.FromImage(bmpPhoto);
        gfxPhoto.SmoothingMode = SmoothingMode.AntiAlias;
        gfxPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
        gfxPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality;
        gfxPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH), targetX, targetY, targetW, targetH, GraphicsUnit.Pixel);
        MemoryStream mm = new MemoryStream();
        bmpPhoto.Save(mm, System.Drawing.Imaging.ImageFormat.Jpeg);
        // Dispose of all the objects to prevent memory leaks
        imgPhoto.Dispose();
        bmpPhoto.Dispose();
        gfxPhoto.Dispose();
        return mm.GetBuffer();
    }

затем вставьте его в базу данных sql я получил код для обрезки изображения. и я знаю, как вставить изображение в базу данных SQL но все это нужно для чтения изображения в виде файла на ПК. я передаю изображение и сохраняю его затем получить его и обрезать его и вставить в БД ПОЖАЛУЙСТА может кто-нибудь сказать мне, как получить поток без необходимости сохранять его

1 Ответ

0 голосов
/ 07 ноября 2010

Вы должны быть в состоянии использовать что-то вроде этого ... (не проверено)

Image img = Image.FromStream((new WebClient()).OpenRead("a"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...