Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - 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;
}
}
Просмотров: 3037
|