Закрыт

Загрузка и сохранение растровых данных в формате PSD (photoshop). (Нужно доделать почти готовый класс)

Нужно реализовать загрузку и сохранение растровых данных в формате PSD (photoshop).

Среда: MSDN VC++ 2012 win32 console api

Имеется готовый код(класс) по загрузке PSD и 80% кода по сохранению (предыдущий исполнитель не доделал проект).

Описание PSD-формата есть на офф.сайте Adobe

Изначально задача была такая:

Формат psd файла (для записи):

- стандартные 8 бит на канал

- Цветовой режим RGB

- цветовой профиль: none В фотошопе это называется "отменить управление цветовым профилем в документе"

- Цвет фона: белый

- квадратная точка

При загрузке нестандартного формата (например 16 бит на канал) - желательно сообщение об ошибке, чтоб пользователь знал, что именно не так

Векторные маски, корректирующие слои, дополнительные каналы(вроде alpha chanel) и прочие нерастровые данные - игнорируем.

Векторные слои и текстовые слои, если можно переделать в обычные растровые слои - переделываем, либо же - тоже игнорируем (создаем пустой растровый слой с таким же именем).

struct _layer{

int id; // номер слоя

int width, height; // ширина\высота слоя

int ppx, ppy; // смещение(позиция) слоя

unsigned char *data; // image data... RGBA

unsigned char *name; // имя слоя

unsigned char opacity;// Прозрачность слоя от 0 до 255 (0 - полная прозрачность)

int floderid; // номер папки, в которой находится слой... если ни в какой, то -1

BOOL visible; // виден или скрыт

int blendmode; // номер режима блендинга слоя (normal\multiply\vivid light\и т.д.)

BOOL opacitylock; //preserve opacity

BOOL lock; //блокированный слой (замок в фотошопе)

};

под data я понимаю построчные данные о пикселях. То есть, точка x,y слоя определяется x*4+y*width*4

struct _folder{

int id; // номер папки

unsigned char *name; // имя слоя

unsigned char opacity;// Прозрачность папки от 0 до 255 (0 - полная прозрачность)

int floderid; // номер папки, в которой находится эта папка (если папка в папке)... если ни в какой, то -1

BOOL visible; // видна или скрыта

BOOL lock; // блокированна

BOOL open; // открыта или закрыта папка

};

struct _mask{

int id; // номер слоя маски

BOOL link2folder; //true, если привязана к папке, false - если к слою

int layerid; // номер слоя или папки, к которой привязана маска

int width, height; // ширина\высота слоя

int ppx, ppy; // смещение(позиция) слоя

unsigned char *data; // image data... 1 байт на пиксель - градация серого (или данные о маски как-то по-другому хранятся?)

unsigned char opacity;// Прозрачность маски от 0 до 255 (0 - полная прозрачность)

BOOL enable; // маска слоя запрещена (зачёркнута в фотошопе)

BOOL invert; // инвертировать маску слоя при блендинге

BOOL connected; // привязана ли к слою\папке (цепочка в фотошопе) (если сложно - не критично)

};

struct _psd{

int canvaswidth, canvasheight;

int dpi;

int numOfLayers;

_layer *layer;

int numOfFolders;

_folder *folder;

int numOfMasks;

_mask *mask;

};

Далее, допустим, есть такой код:

...

_psd psd;

psd.canvaswidth=2222;

psd.canvasheight=1111;

psd.numOfLayers=3;

psd.dpi=72;

psd.layer=new _layer[[url removed, login to view]];

for(int i=0;i<[url removed, login to view];i++){

[url removed, login to view][i].id=i;

[url removed, login to view][i].width=3333;

[url removed, login to view][i].height=444;

[url removed, login to view][i].ppx=+100

[url removed, login to view][i].ppy=-100;

[url removed, login to view][i].name="Слой 1";

long n=[url removed, login to view][i].width*[url removed, login to view][i].height*4;

[url removed, login to view][i].data=new unsigned char[n];

for(int j=0;j<n;j++){[url removed, login to view][i].data[j]=rand()%255;}

[url removed, login to view][i].opacity=255;

[url removed, login to view][i].floderid=-1;

[url removed, login to view][i].visible=true;

[url removed, login to view][i].blendmode=0;//normal

[url removed, login to view][i].opacitylock=false;;

[url removed, login to view][i].lock=false;

}

и аналогично для папок и масок, если они есть

...

и нужна функция которая записывала бы содержимое этого экземпляра в psd-файл...типа:

SavePsd(_psd &psd, "C:\\картинка.psd");

Ну и, соответственно, LoadPsd() по аналогу.

Специально сделал для наглядности структуры, а не класс.

Квалификация: Программирование на С, Программирование на C++, Microsoft

Показать больше struct c programming, rand c programming, int i, c programming struct, c programming rand, c programming char, cplusplus struct, char c programming, vivid, adobe light, multiply image layer, rgba image, win32 console programming, psd layer, 1111, folder photoshop, photoshop mask, photoshop api, api win32, data photoshop

О работодателе:
( 1 отзыв ) Moscow, Russian Federation

ID проекта: #5721221

2 фрилансеров(-а) в среднем готовы выполнить эту работу за $396

rashmibajpai508

A proposal has not yet been provided

$515 USD за 10 дней(-я)
(0 отзывов(-а))
0.0
prilex

Предложение еще не подано

$277 USD за 7 дней(-я)
(0 отзывов(-а))
0.0