yur, понятно. Уже нашёл ошибку, хорошо кодирует. Могу выложить и кодер и декодер, но мне интересно ещё посмотреть и вашу реализацию со свежим взглядом. :) К тому же, файл получается чуть больше, чем от sprview.
Вид для печати
yur, понятно. Уже нашёл ошибку, хорошо кодирует. Могу выложить и кодер и декодер, но мне интересно ещё посмотреть и вашу реализацию со свежим взглядом. :) К тому же, файл получается чуть больше, чем от sprview.
Вот мой вариант компрессора. На входе в SrcCount количество байт для сжатия. Для вектора будет 32768. Через переменную DestCount на входе передаётся размер буфера и он очищается. На выходе содержит количество использованных байт. Это количество байт может быть сохранено в файл при соответствующем округлении до 128.
Код:// Сжатие данных изображения Вектор 06Ц
procedure PackVEC2SPRv1(SrcBuf:pbytearray; SrcCount:integer; DestBuf:pbytearray; var DestCount:integer);
var
i:integer;
b,ce,cne:byte;
ob:word;
begin
// На входе 32 килобайт экранной области. На выходе в переменной DestCount
// возвращается номер последнего байта в сжатых данных. Размер не может превышать 34048
// В самом неудачном случае размер выходных данных получится 18+32768+259=33045 байт
// Процедура не трогает первые 18 байт выходного массива, поэтому, палитру можно записать до сжатия.
// Очистка области от 18 до DestCount (34047) байт
for i:=18 to DestCount-1 do begin
DestBuf^[i]:=0;
end;
// Сжатие данных
DestCount:=18;
ce:=0;
cne:=0;
// ob:=SrcBuf^[0];
ob:=256;
for i:=0 to SrcCount-1 do begin
b:=SrcBuf^[i];
// Компрессор. Вариант 1
if b=ob then begin
// Если байт равен предыдущему, то если есть группа разных байт, запишем их
if cne>0 then begin //Нашли 2 одинаковых байта и счётчик разных больше 0, то
cne:=cne-1; // его нужно уменьшить на 1
ce:=ce+1; // и счётчик одинаковых увеличить на 1
end;
if cne>0 then begin // Если разных байтов >0 то записываем их в буфер
DestCount:=DestCount+cne;
DestBuf^[DestCount]:=cne;
repeat
DestBuf^[DestCount-cne]:=SrcBuf^[i-cne-1];
cne:=cne-1;
until cne=0;
DestCount:=DestCount+1;
end;
// Далее считаем одинаковые байты
ce:=ce+1;
if ce>=127 then begin // Если количество одинаковых байт >=127 то записываем это
DestBuf^[DestCount ]:=b;
DestBuf^[DestCount+1]:=ce+128;
DestCount:=DestCount+2;
ce:=0;
end;
end else begin
if ce=1 then begin
cne:=cne+1;
ce:=0;
end;
if ce>1 then begin // Если есть группа одинаковых байт, запишем их
DestBuf^[DestCount ]:=ob;
DestBuf^[DestCount+1]:=ce+128;
DestCount:=DestCount+2;
ce:=0;
end;
// Считаем разные байты
cne:=cne+1;
if cne>=127 then begin // Если разных байтов >= 127 то записываем их в буфер
DestCount:=DestCount+cne;
DestBuf^[DestCount]:=cne;
repeat
DestBuf^[DestCount-cne]:=SrcBuf^[i-cne+1];
cne:=cne-1;
until cne=0;
DestCount:=DestCount+1;
end;
end;{}
ob:=b;
end;
// В конце записываем остаток
if cne>0 then begin // Если разных байтов >0 то записываем их в буфер
DestCount:=DestCount+cne;
DestBuf^[DestCount]:=cne;
repeat
DestBuf^[DestCount-cne]:=SrcBuf^[SrcCount-cne+1];
cne:=cne-1;
until cne=0;
DestCount:=DestCount+1;
end;
if ce>0 then begin // Если есть группа одинаковых байт, запишем их
DestBuf^[DestCount ]:=ob;
DestBuf^[DestCount+1]:=ce+128;
DestCount:=DestCount+2;
end;
end;
Оффтоп
Здравствуйте.
Ковыряю тут тоже потихоньку граф. форматы Вектора. Возник вот такой вопрос: есть ли у кого все 256 цветов Векторовской палитры в стандартном RGB-виде (для конвертирования в BMP)?[свернуть]
AzAtom, Спасибо за алгоритм - у меня действительно нет сейчас времени, чуток позже
Итак, добавил небольшие изменения:
1) Авто коррекция палиты - теперь при открытиии bmp с палитрой оная исправляется в Векторовскую автоматом а также при открытии палитры pal тоже автокоррекция
2) Палитра пера и заливки выбирается и настраивается отдельно - правой кнопкой мыши выбирается палитра пера, левой палитра заливки
3)Добавлена индикация обозначения палитры пера и заливки
4) Исправлена ошибка - при открытии палитры использовался один диалог открытия и при попытке открыть файл bmp приложение вылетало - теперь всё в норме
На остальное пока нет времени - Сами понимаете лето на исходе, надо зарабатывать
http://cs.pikabu.ru/images/big_size_...4414211007.jpg
Дружище, а ты сам пробовал рисовать в своем редакторе? Ты им доволен? На кой это выкладывать?
Никто кроме тебя пока что не жаловался
А вообще я уже писал- не нравится проходи мимо иначе сам пошлю
Считай, что я не равнодушный. Capture color нет, увеличение 8 мало. И тогда уж убери разворот на весь экран. Если ты это делаешь для себя, базару нет, но когда выкладываешь для всех, это выглядит как - "я научился что-то делать на pc, зацените!"