using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
public static void Main()
Console.WriteLine("Reading Metadata tExt from PNG Loaded from web");
Console.WriteLine("OS Version: {0}" ,Environment.OSVersion);
Console.WriteLine("Operating System: {0}", OS.GetWindowsVersion());
static MemoryStream myMemoryStream = new MemoryStream();
public static void Test1()
var url = "https://raw.githubusercontent.com/moh-hassan/Images/master/kodim03.png";
var img = DownLoadImage(url);
Console.WriteLine("-------------------------------------");
Console.WriteLine("-------------------------------------");
public static Image DownLoadImage(string url)
WebRequest request = WebRequest.Create(url);
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
Stream stream = response.GetResponseStream();
byte[] buffer = new byte[bufferSize];
while (stream != null && (bytesRead = stream.Read(buffer, 0, bufferSize)) != 0)
myMemoryStream.Write(buffer, 0, bytesRead);
Console.WriteLine("Loading {0} byte from server", myMemoryStream.Length);
img = Image.FromStream(myMemoryStream);
stream.CopyTo(myMemoryStream);
byte[] result = (byte[])new ImageConverter().ConvertTo(img, typeof(byte[]));
Console.WriteLine("Have a look to this size compared to original stream from web Response");
Console.WriteLine("Image stream size : {0}", result.Length);
public static Hashtable GetData(Stream stream)
Hashtable metadata = new Hashtable();
imageBytes = myMemoryStream.ToArray();
Console.WriteLine("Reading Metadata using stream as a parameter (direct read from stream with no Image object in between, size: {0}", imageBytes.Length);
if (imageBytes.Length <= 8)
Console.WriteLine("return ->size =0");
while (pointer < imageBytes.Length)
uint chunkSize = GetChunkSize(imageBytes, pointer);
string chunkName = GetChunkName(imageBytes, pointer);
if (chunkName.Equals("tEXt"))
byte[] data = new byte[chunkSize];
Array.Copy(imageBytes, pointer, data, 0, chunkSize);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append((char)t);
string[] pair = stringBuilder.ToString().Split(new char[] { '\0' });
metadata[pair[0]] = pair[1];
Console.WriteLine("Tag Name: {0} | Tag Value: {1}", pair[0], pair[1]);
pointer += (int)chunkSize + 4;
if (pointer > imageBytes.Length)
Console.WriteLine("No metadata available");
public static Hashtable GetData(Image image)
Console.WriteLine("Reading Metadata using Image object as a parameter ( stream->image->stream");
Hashtable metadata = new Hashtable( );
using (MemoryStream stream = new MemoryStream())
image.Save(stream, image.RawFormat);
imageBytes = new byte[stream.Length];
imageBytes = stream.ToArray();
if (imageBytes.Length <= 8)
while (pointer < imageBytes.Length)
uint chunkSize = GetChunkSize(imageBytes, pointer);
string chunkName = GetChunkName(imageBytes, pointer);
if (chunkName.Equals("tEXt"))
byte[] data = new byte[chunkSize];
Array.Copy(imageBytes, pointer, data, 0, chunkSize);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append((char)t);
string[] pair = stringBuilder.ToString().Split(new char[] { '\0' });
metadata[pair[0]] = pair[1];
Console.WriteLine(" Tag Name: {0} | Tag Value: {1}",pair[0] ,pair[1]);
pointer += (int)chunkSize + 4;
if (pointer > imageBytes.Length)
Console.WriteLine("No metadata available");
private static uint GetChunkSize(byte[] bytes, int pos)
byte[] quad = new byte[4];
for (int i = 0; i < 4; i++) { quad[3 - i] = bytes[pos + i]; }
return BitConverter.ToUInt32(quad, 0);
private static string GetChunkName(byte[] bytes, int pos)
StringBuilder builder = new StringBuilder(); for (int i = 0; i < 4; i++) { builder.Append((char)bytes[pos + i]); }
return builder.ToString();
private static Dictionary<string, string> _osVersions = new Dictionary<string, string>
public static string GetWindowsVersion()
OperatingSystem os = Environment.OSVersion;
Version ver = os.Version;
var key = ver.Major + "." + ver.Minor;
if (_osVersions.ContainsKey(key)) name = _osVersions[key];