Растровое изображение в векторное без автотрансформации
I'm currently in the process of writing a code snippet that converts a Raster image to a Vector image. It works but the output becomes quite large on larger images, ex. on an 960px * 800px image the output is around 160mb, I've searched relentlessly on google for a solution of creating an array of sorts for fill blocks(what i save the color values in). So far no such luck so I have decided to seek out the assistance of my fellow coders to enquire of their knowledge and expertise on the matter at hand. Please feel free to leave a comment if you have and knowledge or information, or would like to discuss this concept further or rant if you must :). So far here is the code snippet that i am working with.
public static unsafe void SaveVector(this Image @this, Stream outputStream) { int PixelSize = 4; Rectangle rect = new Rectangle(new Point(0,0), @this.Size); using(StreamWriter SvgWriter = new StreamWriter(outputStream)) { using(Bitmap bitmap = new Bitmap(@this)) { BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadOnly,PixelFormat.Format32bppArgb); SvgWriter.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"); SvgWriter.WriteLine("<svg"); SvgWriter.WriteLine(" xmlns:svg=\"http://www.w3.org/2000/svg\""); SvgWriter.WriteLine(" xmlns=\"http://www.w3.org/2000/svg\""); SvgWriter.WriteLine(string.Format(" width=\"{0}\"", @this.Width)); SvgWriter.WriteLine(string.Format(" height=\"{0}\"", @this.Height)); SvgWriter.WriteLine(" id=\"svg2\""); SvgWriter.WriteLine(" version=\"1.1\">"); SvgWriter.WriteLine(" <defs"); SvgWriter.WriteLine(" id=\"defs4\" />"); SvgWriter.WriteLine(" <metadata"); SvgWriter.WriteLine(" id=\"metadata7\" />"); SvgWriter.WriteLine(" <g"); SvgWriter.WriteLine(" id=\"layer1\">"); int num = 0; for(int y = 0; y < bitmapData.Height; y++) { byte* row=(byte *)bitmapData.Scan0+(y*bitmapData.Stride); for(int x = 0; x < bitmapData.Width; x++) { SvgWriter.WriteLine(" <rect"); SvgWriter.WriteLine(string.Format(" style=\"fill:{0};fill-opacity:1;stroke-width:0.43599999000000000;stroke-miterlimit:4;stroke-dasharray:none\"", ColorTranslator.ToHtml(Color.FromArgb( row[(x * PixelSize) + 3], row[(x * PixelSize) + 2], row[(x * PixelSize) + 1], row[x * PixelSize])))); SvgWriter.WriteLine(string.Format(" id=\"rect{0}\"", num)); SvgWriter.WriteLine(" width=\"1\""); SvgWriter.WriteLine(" height=\"1\""); SvgWriter.WriteLine(string.Format(" x=\"{0}\"", x)); SvgWriter.WriteLine(string.Format(" y=\"{0}\" />", y)); num++; } } bitmap.UnlockBits(bitmapData); } SvgWriter.WriteLine(" </g>"); SvgWriter.WriteLine("</svg>"); } } }
Sergey Alexandrovich Kryukov
Это не "обращение". И зачем пытаться сделать вектор из растра? Это никогда не может быть сделано с хорошим качеством, по самой природе вещей.
—СА
BillWoodruff
Мне любопытно: вы пробовали взять свой 160-мегабайтный файл, сжать его с помощью WinRar и Zip и сравнить размеры файлов ?
Я предполагаю, что разработка этого кода-хороший опыт обучения для вас, но я не вижу ничего выходящего из него, что было бы полезно в практическом программном приложении.