Интернет магазин китайских планшетных компьютеров



Компьютеры - Portable anymap - 16-битное расширение

15 мая 2011


Оглавление:
1. Portable anymap
2. Использование в Netpbm
3. 16-битное расширение



Изначально бинарные форматы PGM и PPM поддерживали битовую глубину не более 8 бит. Конечно, можно было использовать форматы ASCII, но при их использовании увеличивается размер и замедляется чтение файлов. В результате многие разработчики пытались расширить формат для поддержки большей битовой глубины. При использовании большей глубины, мы сталкиваемся с проблемой порядка байтов в файле. Различные приложения не согласованы в каком-либо одном следовании порядка байтов. Netpbm при работе с PNM de facto использует порядок от старшего к младшему.

Пример PPM

P3
# 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

Изображение: Tiny6pixel.png

Формат 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


Этот код на C# позволяет сохранить Bitmap в PPM:

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


<<<