Inferno #07
31 мая 2005
  Софт  

Likbez - The principles of converting graphics PC-ZX.

<b>Likbez</b> - The principles of converting graphics PC-ZX.
            The principles of converting graphics PC-> ZX



   This article was written last in a row and in great haste,
so sorry for smurnotu. Perhaps in the future I will write more
detailed article about the conversion.


   Previously preferred to convert a 3 screen, since it through
extremely simple: just in Photoshop, upload the screen in 8 
colors and transfer points of bmp format in the Spectrum tiny

applets on ZX (now the operation can be performed automatically
cally in any JPEG viewer to ZX). But there are 3 screens
 vennye disadvantages:

   1. Scary shimmer;

   2. Solid white color is especially scary flashes;

   3. To show the pictures to spend 2 / 3 of CPU time;

  4. Only 8 colors (and even 6912 and then more), respectively,
 screen is covered with "dust", "dandruff";

  5. The picture is very much weight.

   As you can see, I prefer to convert a two-screen
or into one. One screen gives a rough picture, but it
much easier to use in the program. Many of the stories is quite
decent look at one screen. Two screens allow mapping
zit almost anything. Two screens offer 83 colors, if used
walk from the assumptions that:
- Dark shines twice as bright weaker;
- "Black" "bright red" = "dark red" + "dark red", etc.



   . Img (Gigascreen) - it's just 2 screens with standard 
difference formulation.


   And that's what. Mcx:
- 1 st screen sprite;
- The attributes of the 1 st screen sprite;
- 2 nd screen sprite;
- The attributes of the 2 nd screen sprites.

   Such pictures you can see in the game Hexagonal Filler. There
 the idea of ​​simplified mcx-modes:

   a) one of the screens are always black and white;

  b) one of the screens clean Spectrum.

   These simplified regimes are easily derived without the 
turbo, without distortion pictures.



   Present to you the converter at Delphi, written
from want and are not intended for this release (I do not
intend to become ptsshnym programmer), but the older version
which was distributed in a shell SpeConvertor by Aprisobal.
To them, I convert the graphics to IG (before that I used
8col). Of course, the result of the conversion must expunge
Manual (6,912 screens - in the BGE, screens img - in DBS), but 
the general the result is quite positive.



   ZX screen consists of familiarity. Therefore, we must find
each familiarity most successful palette. It is possible
take into account the "average color" of the picture, as can be 
seen each familiarity as a separate. But the real rift

realizable only in the conversion of diamond (chankovoy) 
hatching which gives a rather blurred image. When the 
conversion from Floyd-Steinberg need to distribute the error 
representation accumulated at the boundary points of 
familiarity, right and down. 

   Now a brief comment. I hold no error in the register /
variables, and directly into the array that stores the original
picture. That is, if I say "propagating errors, we have
in mind that simply correcting 4 pixels (right, bottom, left
bottom and right below the current one), adding to them the 
error before representation of the current pixel, respectively, 
with coefficients 1 / 2, 1 / 4, 1 / 8 and 1 / 8.


   At first I wanted to handle the border familiarity special
way: distribute the error pixels, standing at the right edge
familiarity on all 8 to the right points. But it turned
disgusting. Therefore, the current version of the converter 
limits familiarity is no exception itself does not represent. 
To the left edge of the screen can be treated in a special way: 
to avoid appears next to her solid vertical lines to the colors 
of her pixels to add a random number. It is dangerous to

solid black or white background. But such an operation produces
8col upon conversion of the img / mcx in 8 colors.


   I will talk specifically about the problems of conversion is 
in img / mcx, conversion to 6912 is somewhat simpler (such 
converter is easily make the converter img / mcx simplification 
of the program) ... 


   Conventionally, we denote the levels of each color component 
by b0, b1, b2, b3, b4 (from zero to very bright) and obtain a 
visual table of all the colors (in each bracket - levels: r, g, 
b; right marked brightness included: "B"):

(B0, b1, b2) (b0, b2, b1) (b1, b0, b2) (b1, b2, b0) (b2, b0, 
b1) (b2, b1, b0) (B0, b1, b3) (b0, b3, b1) (b1, b0, b3) (b1, 
b3, b0) (b3, b0, b1) (b3, b1, b0) B (B0, b2, b3) (b0, b3, b2) 
(b2, b0, b3) (b2, b3, b0) (b3, b0, b2) (b3, b2, b0) B (B0, b2, 
b4) (b0, b4, b2) (b2, b0, b4) (b2, b4, b0) (b4, b0, b2) (b4, 
b2, b0) BB (B1, b2, b3) (b1, b3, b2) (b2, b1, b3) (b2, b3, b1) 
(b3, b1, b2) (b3, b2, b1) B 014,124,234,034,134 no

(B0, b0, b1) (b0, b1, b0) (b1, b0, b0) (b0, b1, b1) (b1, b0, 
b1) (b1, b1, b0) (B0, b0, b2) (b0, b2, b0) (b2, b0, b0) (b0, 
b2, b2) (b2, b0, b2) (b2, b2, b0) (B0, b0, b3) (b0, b3, b0) 
(b3, b0, b0) (b0, b3, b3) (b3, b0, b3) (b3, b3, b0) B (B0, b0, 
b4) (b0, b4, b0) (b4, b0, b0) (b0, b4, b4) (b4, b0, b4) (b4, 
b4, b0) BB (B1, b1, b2) (b1, b2, b1) (b2, b1, b1) (b1, b2, b2) 
(b2, b1, b2) (b2, b2, b1) (B1, b1, b3) (b1, b3, b1) (b3, b1, 
b1) (b1, b3, b3) (b3, b1, b3) (b3, b3, b1) B (B2, b2, b3) (b2, 
b3, b2) (b3, b2, b2) (b2, b3, b3) (b3, b2, b3) (b3, b3, b2) B 
(B2, b2, b4) (b2, b4, b2) (b4, b2, b2) (b2, b4, b4) (b4, b2, 
b4) (b4, b4, b2) BB 14.34 No

(B0, b0, b0) (b1, b1, b1) (b2, b2, b2) (b3, b3, b3) (b4, b4, b4)

   With such a broad palette, we can easily show how
skin tones and bright colors without messing up their redundant
number of "dandruff."

   But apart from this palette, we need to bear in mind another 
palette: set of all tuples (i1, p1, i2, p2), ie, the attributes 
of sign- place on both screens. How many of them can be used

completely unknown (manual counting - a lot of work, fraught 
with errors). I have compiled statistics on approximately 20 
images, converting to a simple enumeration of colors in the 
palette, and received file tablo.dat (sm.ishodnik in the 
appendix), containing 1708 palettes. Palettes are ordered by 
frequency of use, but restriction of the most frequent 256 
palettes, and even the most frequent five hundred nor to no 
good cause ... 


   Here's how I went through the color palettes before this
table:
for b1: = 0 to 1 do for b2: = b1 to do a
for i1: = b1 shl 3 to b1 shl 3 +6 do
for i2: = i1 +1 to b1 shl 3 +7 do
for i3: = b2 shl 3 to b2 shl 3 +6 do
for i4: = i3 +1 to b2 shl 3 +7 do begin
...


   But now how to iterate:
for ti: = 0 to datcnt {1707} do begin
i1: = tablo [ti, 0]; i2: = tablo [ti, 1]; i3: = tablo [ti, 2]; 
i4: = tablo [ti, 3]; ...



   Inside the loop evaluation of the quality chosen palette. For
Such is the opinion adopted by the sum of all 64 reporting 
errors pixels familiarity with colors from the selected 
palette. For the error representation in this case take the 
Euclidean distance. But the simple sum of the absolute value of 
the difference of 3 components yields a result no worse. Why, 
then, sqr, and not the abs? So It turned out that the HRC sqr 
runs faster ... 

   The distance is taken between the point under consideration, 
and familiarity considered the most suitable color palette. In 
the palette of 4 Color (i1 + i2, i1 + p2, p1 + i2, p1 + p2), 
but their number is also adding is the 5 th "average" color: 
(i1 + p1 + i2 + p2) / 2. Previously, instead of the 5 colors 
was 9, but the difference in the resulting image is almost 
invisible. 

   This search - the slowest place throughout the program.

    How to speed it up?

  1. Interrupts without exhausting all the pixels, the 
accumulation through extremely large total errors on the 
palette. Extremely big mistake is one that is more than found 
for previous palettes minimum (although you can offer an option 
for where we take a break if, for example, after the 40 pixels 
of 64  exceeded half of the minimum).


  2. This minimum before exhaustion of all palettes pre-
sought for the previous panel (adjacent to the left or above)
familiarity, because it has a chance to be the most successful 
firing  Roy and the current familiarity.


  3. This minimum is for a previous familiarity is multiplied by
factor less than unity (eg 0.75) - then we
We often choose the previous color, but will soon
out of the calculation error on a palette.

Diver>
Are you sure that you choose the most suitable combination of 
colors? Alone Coder>

Not at all sure, otherwise there were no striped sky.


   "Striped heaven" appear on the broad areas of the picture,
covered with flowers, which can not be accurately represented 
by two screens. And these colors are. After all, if we imagine 
all possible colors as a cube (one coordinate - R, 2-I - G, 
third - B), then even the best we have found presents a palette

just a parallelogram (a kind of "plane of Flowers") inside
the cube. And since the number of palettes, of course, they are 
clearly not fill the entire space inside the cube.


   Here is a cube, it parallelogram representing one of the
palettes, and the parallelogram are the same 5 points of color 
which we compare with this point:




   How to find the best palette of knowing about this shortage? 
Perhaps converter should be avoided as much as to change the 
current palette (More precisely, to actually use it in color) 
throughout the more or less monochrome (with no breaks, and 
borders), the color spot in the picture. But how can this be 
implemented? It is still unknown. 

Here is an excerpt from my letter to Diver'u:


   What we do is different 2-bitplanovaya palette from the 
usual? Meanwhile, that it defines a color cube is not cut, and 
some plane (parallelogram), inside which all colors can be

 defined our palette with hatching (exactly).

   What we do is different from the familiarity familiarity 8x8 
1x8? Meanwhile, that the uniform section of a picture (without 
breaks) used to determine the familiarity of color in the first 
- some color surface, and the second - some color

Line. Thus, we need to find the color parallelogram
that most accurately describe the color of our color line, and
error reporting, and remember that it did not disappear,
 add to the colors of the underlying familiarity.

   The best would be a parallelogram parallelogram, which
has some minimal total error reporting points
familiarity. Total number of different forms of parallelograms 
in the 27-color (Simplified) panel with a well-known to us 
there are limitations, if my multiple sclerosis, 20 as well as 
in 83-color - not considered, and how much is not the form, and 
pieces, of different palettes - the  a Horseradish know:)


   I have a total error is, I know, wrong, and
so: as the sum of squared deviations (according to the formula 
length Euclidean space, with different coefficients for R, G, B)

from nine control points of the parallelogram of color, which 
points best describes the palette of this parallelogram. Himself

 know that this is in 9 colors:)

   Why is this method wrong? because he may deem
best a palette that all points of familiarity will come
For example, on one side of the parallelogram, and all the 
familiarity zamazhetsya one color, while all errors will be one 
and the same sign.




    I later visited this idea:

  1. 90% of the pixel brightness familiarity should fall into 
the range  brightness, defined by the chosen palette.


  2. Region in the plane UV (Cb = YB, Cr = YR), filled
Pixel familiarity, should a 90% fall in the palette (it is 
necessary  table: for each palette value minU, maxU, minV, 
maxV). 

  3. Same as (1, 2), but in the coordinates of RGB, then the 
area color space will be set more accurately than a 
parallelogram  gram.


  4. From ravnopodhodyaschih palettes to choose the narrowest.

   This idea should think about ... It should not only improve
picture quality, but also accelerate the conversion, which will
write to the ZX similar converter.


   Another problem - with chankovoy hatching. It is packed
much better than the Floyd, so the area without the fine details
better to convert through it. As you can see, in my
converter is for such a special allocation of the brush. But
tried to anoint her for img picture, you probably will
disappointed with the result - will float color. Why? I do not 
know. I proceed from the obvious to odnoekrannomu conversion 
method. 

   Such a method.

   Consider the palette as a segment of the RGB cube, and a 
color that need to provide this palette, as some point in the 
same cube. Required to find the level of shading (0 = clean 
paper'a to 1 = Net ink'a). Create a segment on our real axis: 
set 0 on paper'nom end and 1 on ink'ovom. Omitted from the 
perpendicular points on the segment. Coordinate perpendicular 
base and will desired level (if it is less than 0, then we 
assume zero if more 1, we consider the unit).


   This method allows for chankovoy hatching the same levels as
Floyd.

   Complicate the method for the case of img.

   Create a parallelogram on our panel grid
(On the corners again, the zeros and ones). Omit perpendicular 
to plane of the parallelogram. We take the coordinates of the 
base perpendicular kulyara (again with the amputation of an 
overflow) - they will be shading densities on the 1 st and 2 nd 
screens. 

   If all the colors in the palette are collinear (parallel
gram has degenerated into a segment), the method does not work 
- you have to apply shamanic recount.


   And still the resulting level of shading for some reason not
coincides with Floydovskim ... Maybe I'm wrong led
formula? Sometimes ...


   What else is there in the converter:

  - Dithering level - the level of "dustiness" of colors that 
are close to net. If equal to 1, then all colors will be 
"dust". If 0, will use exactly two of graduation. A similar 
parameter there is in Photoshop, in my version of JPEG, and in 
my videokonvertore. Without it, convert meaningless.


  - Saturation - hue (0 - B / W, 1 - normal level of color
In particular, 1.5 - slightly taller, and generally can be 
increased without loss tions). Without this option, convert, 
too pointless. 

  - Chankovaya hatching is in 2 versions: 65 levels (8x8) - by
default - and 5 levels (2x2).

  - You can prohibit the use of two levels of bright in the 
conversion (Sometimes avoids unnecessary "square" image).


  - When elozenii mouse on the screen can be seen ZX attributes
each familiarity (for img / mcx - separately for the 1 st screen
separately for the 2-nd).

  - Dithering level can be changed and during kistemazaniya 
Chanco howl hatching (left mouse button - chankovaya hatching, 
right - Floyd). Kistemazanie only works if the

Image originally converted into mode Floyd. Size
brushes can be changed. After kistemazaniya need to click
Save.

  - Square button on the left bottom off the image (for
those who have to work behind the head:)).

  - Choose a border, which will be cut image
You can enter numbers, but you can Clicking on the picture 
itself: the left button (one corner) and right (another angle).


  - ZX pictures in all formats that the program can gene
erate, it can also be downloaded.

  - All formats (including emg, who never used
forms a) read the handbook Nuts'a "sprites.txt".

  - Module tgapng - my old course work. Can use
vat in their programs (there is a function not only for the 
retrieval ki, but for the unloading of these formats). Source 
GifImage (by Anders Malender) I did not write - it is very big. 
If need, look somewhere in the internet. Source jpeg.dcu I,

seems to be no.

   I checked the archive: the Delphi 6 program is compiled.
If you have any problems with the compilation, throw out the 
program all left formats (jpg, gif, png, tga), together with 
their modules - will remain a format bmp.


A. Coder




Other articles:

Classics - Almanashnik. Alexander Pushkin.

For Coderz - Recognition and computation of arithmetic expressions on their character record.

Inferno - The authors of the magazine.

For Coderz - the discipline to create large projects.

Interview - Questions Konstantin Sviridov (Conan) on the site zxnext.narod.ru.

Likbez - The principles of converting graphics PC-ZX.

For Coderz - Programming disc changer / drive in Scorpio.

Softinka - DNA_OS v0.431 - package of utilities for working with hard drives, RAM-drives and floppy disks.

For Coderz - Programming under DNA_OS ZET-9, a package of tools to work with storage devices.

Softinka - The problems and shortcomings package of tools to work with storage devices DNA_OS.

Likbez - details about disk formats that are FAT.

Inferno - Entered from the editor.

Inferno - Errors in the previous numbers.

For Coderz - Small programmers' tricks.

Gameland - On the new games: Oneyroid, Dizzy forever, Dridlock.

For Coderz - Writing archive. Practical principles LZ packaging.

Gameland - Passage of new shipments for the game "Black Crow".

For Coderz - Programming for the video mode 384x304.

Inferno - Letters to the Editor.

Sound - Eden Megus'a about the tracker for the AY / YM.

Inferno - On the shell.

For Coderz - Fundamentals of optimization for the processor Z80.

Likbez - The location of partitions on your hard drive.

Gamedev - 3D projection of the floor / road in the games.

Sound - Wild ideas for AY trackers.

Advertising - Ads by Roman Chuunin.

Advertising - Ads by V. Bogdanovich

For Coderz - How a large Flexible Program.

Repair - Faults Pentagon 128 + and their repair.

Inferno - Content.

Miscellaneous - Thoughts on the contest for the best software.

Others - Transfer software on ZX Spectrum with a PC.

Video - On packaging for a video ZX Spectrum.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Similar articles:
News - At etoi week at the bazaar there is a new (to us) igruha RETURN TO HOME.
a rest - Something: one day in the life of a programmer

В этот день...   5 May