Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Portable anymap - 16-битное расширение15 мая 2011Оглавление: 1. Portable anymap 2. Использование в Netpbm 3. 16-битное расширение Изначально бинарные форматы PGM и PPM поддерживали битовую глубину не более 8 бит. Конечно, можно было использовать форматы ASCII, но при их использовании увеличивается размер и замедляется чтение файлов. В результате многие разработчики пытались расширить формат для поддержки большей битовой глубины. При использовании большей глубины, мы сталкиваемся с проблемой порядка байтов в файле. Различные приложения не согласованы в каком-либо одном следовании порядка байтов. Netpbm при работе с PNM de facto использует порядок от старшего к младшему. Пример PPMP3 # P3 обозначает, что цвета даны в ascii, # затем идут цифры, обозначающие число колонок и рядов, # 255 для максимального значения цвета, # затем триплеты RGB 3 2 255 255 0 0 0 255 0 0 0 255 255 255 0 255 255 255 0 0 0 Изображение: Формат P6 для этого же изображения будет хранить цвет в одном байте. Файл будет меньше, но информация о цвете не будет восприниматься человеком: P6 #тут возможна строка комментариев 3 2 255 !@#$%^&*_+|{}:"< Формат PPM не сжат и поэтому вовсе неэкономичен по размеру и скорости передачи. Например, 192×128 PNG изображение может иметь размер 552 байта. После конвертации в 192×128 PPM изображение, размер файла составит 73848 байт. Формат PPM в основном переходной к более экономному формату, в частности PNG. Например, формат PPM может быть конвертирован в PNG без потери информации. Формат PPM достаточно прост для написания кода «с нуля». Далее приведен листинг на Python, создающий изображение, которое мы обсуждали выше. Пример можно адаптировать. #!/usr/bin/python triplets=[ , , , , , ] width=3 height=2 comment='any comment string' ftype='P6' #use 'P3' for ascii, 'P6' for binary ppmfile=open ppmfile.write) ppmfile.write ppmfile.write) ppmfile.write if ftype=='P3': for red,green,blue in triplets: ppmfile.write) elif ftype=='P6': #print 1 byte per color for red,green,blue in triplets: ppmfile.write) ppmfile.close
private static void SavePpmBitmap { BitmapData Data = Image.LockBits, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); IntPtr DataBegin = Data.Scan0; int byteCount = Data.Stride * Data.Height; byte arImage = new byte; System.Runtime.InteropServices.Marshal.Copy; Image.UnlockBits; for { byte swp = arImage; arImage = arImage; arImage = swp; } using ) { StreamWriter sw = new StreamWriter; sw.Write; sw.Write; sw.Write; sw.Flush; BinaryWriter bw = new BinaryWriter; bw.Write; bw.Flush; OutFile.Close; } } Просмотров: 2603
|