Я новичок в C #, и сейчас я работаю с этим фрагментом кода:
//Take a snapshot from left camera and save to current directory as "snapshot.png" case Key.Z: int left = camLeft.Device.LensCorrection1; camLeft.Device.LensCorrection1 = 0; Thread.Sleep(150); BitmapSource bmpSource = camLeft.Device.BitmapSource as BitmapSource; MemoryStream ms = new MemoryStream(); BitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bmpSource)); encoder.Save(ms); ms.Seek(0, SeekOrigin.Begin); System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(ms); string filepath = Environment.CurrentDirectory; string fileName = System.IO.Path.Combine(filepath, @"snapshot.png"); bitmap.Save(fileName, ImageFormat.Png); bitmap.Dispose(); camLeft.Device.LensCorrection1 = left; break;
Это код, разработанный для камеры, который при нажатии кнопки принимает моментальный снимок и сохраняет его как файл png. Это само по себе работает, но я пытаюсь сделать так, чтобы он также принимал данные изображения и автоматически отправлял их на веб-страницу PHP, которая автоматически берет данные и отображает изображение (минуя необходимость хранить его на сервере MySQL) , Я хочу, чтобы все это работало с одним нажатием кнопки – из моментального снимка, чтобы все это загрузилось на просматриваемую страницу.
Итак, вот что выглядит выше, с новым, проблемным / нерабочим кодом, вставленным между пробелом в приведенном выше коде:
//Take a snapshot from left camera and save to current directory as "snapshot.png" case Key.Z: int left = camLeft.Device.LensCorrection1; camLeft.Device.LensCorrection1 = 0; Thread.Sleep(150); BitmapSource bmpSource = camLeft.Device.BitmapSource as BitmapSource; MemoryStream ms = new MemoryStream(); BitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bmpSource)); encoder.Save(ms); ms.Seek(0, SeekOrigin.Begin); byte[] imageBytes = ms.ToArray(); string base64 = ImageToBase64(imageBytes); string base64Encoded = HttpUtility.UrlEncode(base64); WebClient client = new WebClient(); client.UploadString("www.thisismydesiredurl.com", base64Encoded); System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(ms); string filepath = Environment.CurrentDirectory; string fileName = System.IO.Path.Combine(filepath, @"snapshot.png"); bitmap.Save(fileName, ImageFormat.Png); bitmap.Dispose(); camLeft.Device.LensCorrection1 = left; break;
ImageToBase64 – это метод, который преобразует изображение в base64, как подразумевается:
public string ImageToBase64(byte[] imageBytes) { // Convert byte[] to Base64 String string base64String = Convert.ToBase64String(imageBytes); return base64String; }
Дополнительный код предназначен для того, чтобы взять изображение, преобразовать его в байты, преобразовать его в base64, а затем загрузить строку с помощью метода POST на страницу PHP, готовую для получения данных. Затем на странице PHP есть следующий код, предназначенный для декодирования и отображения изображения:
<?php $data = $_POST['base64Encoded']; $decodedata = urldecode($data); $rawdata = base64_decode($decodedata); $source = imagecreatefromstring($rawdata); ?> <img src= "<?php echo $source ?>" alt="test"/>
Но он не работает – изображение не отображается, но я знаю, что страница вверх. Что мне не хватает?
Я также открыт для более простых / альтернативных решений, о которых я, возможно, не знаю. Все, что я хочу, – это автоматически просматривать этот образ по определенному URL-адресу одним нажатием кнопки – вот и все .
Изменить: приведенный ниже ответ «работает», но я всегда получаю разбитое изображение на своем веб-сайте – так что изображение загружается и отправляется на веб-сайт, оно просто не кодируется / декодируется правильно. Похоже, и не понять, почему. Мысли?
как вы это делаете, он никогда не будет работать. Когда вы создаете HTTP POST, скрипты на стороне сервера предназначены для обработки и получения результата. Однако тот же вывод не будет отображаться при посещении скрипта вне запроса на отправку по http.
Вам нужно будет опубликовать данные в сценарий загрузки изображений. Этот скрипт должен сохранить файл на сервере и отобразить его.
например:
C #
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Drawing; using System.Collections.Specialized; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { // Load a image System.Drawing.Image myImage = GetImage("http://personal.psu.edu/tao5048/JPG.jpg"); // Convert to base64 encoded string string base64Image = ImageToBase64(myImage, System.Drawing.Imaging.ImageFormat.Jpeg); // Post image to upload handler using (WebClient client = new WebClient()) { byte[] response = client.UploadValues("http://yoursite.com/test.php", new NameValueCollection() { { "myImageData", base64Image } }); Console.WriteLine("Server Said: " + System.Text.Encoding.Default.GetString(response)); } Console.ReadKey(); } static System.Drawing.Image GetImage(string filePath) { WebClient l_WebClient = new WebClient(); byte[] l_imageBytes = l_WebClient.DownloadData(filePath); MemoryStream l_stream = new MemoryStream(l_imageBytes); return Image.FromStream(l_stream); } static string ImageToBase64(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat format) { using (MemoryStream ms = new MemoryStream()) { // Convert Image to byte[] image.Save(ms, format); byte[] imageBytes = ms.ToArray(); // Convert byte[] to Base64 String string base64String = Convert.ToBase64String(imageBytes); return base64String; } } } }
PHP test.php
<?php // Handle Post if (count($_POST)) { // Save image to file $imageData = base64_decode($_POST['myImageData']); // Write Image to file $h = fopen('test.jpg', 'w'); fwrite($h, $imageData); fclose($h); // Success exit('Image successfully uploaded.'); } // Display Image if (file_exists('test.jpg')) { echo '<img src="test.jpg" />'; } else { echo "Image not uploaded yet."; } ?>
Вывод приложения C #:
После загрузки изображения, если вы посещаете http://yoursite.com/test.php (например) в браузере, это то, что вы видите (т. Е. Загруженное изображение из c #, сохраненное на сервере, для обслуживания):
Надеюсь это поможет.