Как подготовить файл для оператора loadpng в CLX


[ Пpишедшие ответы ] [ Отпpавьте свой ответ ] [ Пеpеговоpный пункт ] [ FAQ ]

Posted by Аркадий Водяник (195.58.229.56) on September 01, 2002 at 01:23:18:

Мы предполагаем, что в распоряжении пользователя есть
самый простой инструмент для создания изображений:
PAINT из Windows. Предполагаем также, что количество
цветов, поддерживаемых драйвером дисплея, составляет
либо 65536, либо 16777216. В этих условиях PAINT создает
*.bmp файлы с 24-мя битами на пиксел и одной битовой
плоскостью. Чтобы преобразовать такие файлы в *.png с
подходящими для loadpng характеристиками (32 бита на пиксел,
байты идут так: RGBA, где А-признак прозрачности, если
этот байт равен 255) можно использовать предлагаемую
ниже форму на языке ФБП:


*
?fn Имя BMP файла:
loadbin fn + '.bmp'; NN=[ged 'lb.N']
n=0; s=[ged 'lb.1']; L=[length s]
*

t=[cp s,19,2]; x=[hc t,1] + [hc t,2]*256
ширина: \
printstr [intsn x]

t=[cp s,23,2]; y=[hc t,1] + [hc t,2]*256
высота: \
printstr [intsn y]

t=[cp s,27,1]; k=[hc t,1]
if k <> 1
Число битовых плоскостей не равно 1.
stop
endif
t=[cp s,29,1]; k=[hc t,1]
if k <> 24
Число битов на пиксел не равно 24.
stop
endif

for i=55 to L n=n+1; [a n, [cp s,i,1]]; endfor
*
for j=2 to NN
s=[ged 'lb.'+[intsn j]]; L = [length s]
for i=1 to L
n=n+1; [a n, [cp s,i,1]]
endfor
endfor
*
n=0
for i=y-1 downto 0
for j=0 to x-1
n=n+1; ij=(i*x+j)*3+1;
xx=[a ij+2]+[a ij+1]+[a ij]
if xx = [ch 0]+[ch 0]+[ch 0]
xx = [ch 0]+[ch 0]+[ch 0]+[ch 255]
endif
[b n,xx]
endfor
endfor
*
makepng b,x,y, fn + '.png'
printstr 'Образован файл '+ fn +'.png'

В этой форме сделано предположение, что если в *.bmp
встретился черный цвет ([ch 0]+[ch 0]+[ch 0]), то считать
его прозрачным (через него будет виден фон layer'a).
Разумеется, что пользователь может легко отказаться от этой
условности или заменить ее на более подходящую.


Пpишедшие ответы:



Отпpавьте свой ответ

Name:
E-Mail:

Subject:

Comments:
Link URL:
(можно не вводить)
Link Title:
(можно не вводить)
Image URL:
(можно не вводить)
ВАЖНО: Если отпpавленное сообщение не будет видно сpазу в
списке сообщений, нажмите клавишу Reload в browser'e.


[ Пpишедшие ответы ] [ Отпpавьте свой ответ ] [ Пеpеговоpный пункт ] [ FAQ ]