Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Adobe PhotoShop nije pisan u Borland C++ Builderu

[es] :: C/C++ programiranje :: Adobe PhotoShop nije pisan u Borland C++ Builderu

[ Pregleda: 3549 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Duke Nukem
Miroslav Mitic
dipl.mas.ing - tehnolog za hidrauliku/
REL, MAG panciranje i zavarivanje bla
bla...
Lazarevac

Član broj: 38933
Poruke: 143
*.absolutok.net.



+1 Profil

icon Adobe PhotoShop nije pisan u Borland C++ Builderu15.05.2005. u 08:16 - pre 230 meseci
Ima li neko adresu sa primerima obrade bit mapirane grafike
na primer opcije iz Adobe photoshopa izvrtanje slike, filteri, efekti...
mozda bi pomogli detlalji izvornog koda GIMPA za windows, al ne mogah
da ih lociram na netu.

Tape loading error
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Adobe PhotoShop nije pisan u Borland C++ Builderu15.05.2005. u 08:40 - pre 230 meseci
Sve ozbiljnije obrade za bitmapirane manipulacije se nalaze u nekoj biblioteci
čiju adresu ne mogu (još uvek) da pronađem... Za početak pogledaj:

http://fatman98.fa.funpic.de/builder_grafik.php
http://bcbjournal.org/free_issue/vol8_num6.4.htm

Nešto za Blur...

Citat:

> I have a picture, I simply want to apply a blur on it.
> Can someone explain to me clearly how to code a blur function
> into C++ builder with TImage?

You can blur an image by concolving the pixels with averaging kernel. For
example, if you move the following window across each pixel, then set that pixel
to the sum of each filter tap (entry) times the pixel underneath it, you can
blur the image...

+-----+-----+-----+
| 1/9 | 1/9 | 1/9 | +-----+-----+-----+
| 1/9 | 1/9 | 1/9 | +-----+-----+-----+
| 1/9 | 1/9 | 1/9 |
+-----+-----+-----+


Here's an example for a 24-bit TBitmap...


#define FIX0(x) (x < 0 ? 0 : x)
#define CLIP255(x) (x > 255 ? 255 : x)

#include <cassert>
void BlurBitmap(Graphics::TBitmap* ABitmap)
{
assert(ABitmap != NULL);
ABitmap->PixelFormat = pf24bit;

const float h[][3] =
{{0.2, 0.2, 0.2},
{0.2, 0.2, 0.2},
{0.2, 0.2, 0.2}};

const int width = ABitmap->Width;
const int height = ABitmap->Height;

for (int y = 1; y < height - 1; ++y)
{
RGBTRIPLE* line_prev =
static_cast<RGBTRIPLE*>(ABitmap->ScanLine[y - 1]);
RGBTRIPLE* line_curr =
static_cast<RGBTRIPLE*>(ABitmap->ScanLine[y]);
RGBTRIPLE* line_next =
static_cast<RGBTRIPLE*>(ABitmap->ScanLine[y + 1]);

for (int x = 1; x < width - 1; ++x)
{
float blue =
(h[0][0] * static_cast<float>(line_prev[x - 1].rgbtBlue)) +
(h[0][1] * static_cast<float>(line_prev[x].rgbtBlue)) +
(h[0][2] * static_cast<float>(line_prev[x + 1].rgbtBlue)) +
(h[1][0] * static_cast<float>(line_curr[x - 1].rgbtBlue)) +
(h[1][1] * static_cast<float>(line_curr[x].rgbtBlue)) +
(h[1][2] * static_cast<float>(line_curr[x + 1].rgbtBlue)) +
(h[2][0] * static_cast<float>(line_next[x - 1].rgbtBlue)) +
(h[2][1] * static_cast<float>(line_next[x].rgbtBlue)) +
(h[2][2] * static_cast<float>(line_next[x + 1].rgbtBlue));

float green =
(h[0][0] * static_cast<float>(line_prev[x - 1].rgbtGreen)) +
(h[0][1] * static_cast<float>(line_prev[x].rgbtGreen)) +
(h[0][2] * static_cast<float>(line_prev[x + 1].rgbtGreen)) +
(h[1][0] * static_cast<float>(line_curr[x - 1].rgbtGreen)) +
(h[1][1] * static_cast<float>(line_curr[x].rgbtGreen)) +
(h[1][2] * static_cast<float>(line_curr[x + 1].rgbtGreen)) +
(h[2][0] * static_cast<float>(line_next[x - 1].rgbtGreen)) +
(h[2][1] * static_cast<float>(line_next[x].rgbtGreen)) +
(h[2][2] * static_cast<float>(line_next[x + 1].rgbtGreen));

float red =
(h[0][0] * static_cast<float>(line_prev[x - 1].rgbtRed)) +
(h[0][1] * static_cast<float>(line_prev[x].rgbtRed)) +
(h[0][2] * static_cast<float>(line_prev[x + 1].rgbtRed)) +
(h[1][0] * static_cast<float>(line_curr[x - 1].rgbtRed)) +
(h[1][1] * static_cast<float>(line_curr[x].rgbtRed)) +
(h[1][2] * static_cast<float>(line_curr[x + 1].rgbtRed)) +
(h[2][0] * static_cast<float>(line_next[x - 1].rgbtRed)) +
(h[2][1] * static_cast<float>(line_next[x].rgbtRed)) +
(h[2][2] * static_cast<float>(line_next[x + 1].rgbtRed));


blue = blue / 1.8; // 0.2 * 9
green = green / 1.8; // 0.2 * 9
red = red / 1.8; // 0.2 * 9

line_curr[x].rgbtBlue = FIX0(CLIP255(blue));
line_curr[x].rgbtGreen = FIX0(CLIP255(green));
line_curr[x].rgbtRed = FIX0(CLIP255(red));
}
}
}

For different effects, simply change the taps (entries) of the filter kernel.
For more blur, increase the size of the kernel, or simply filter the image
successively.


Imam još nešto primera (gradient fill) , ali više nisu na net-u tamo gde su nekada
bili.
 
Odgovor na temu

dragansm
Dragan Smiljanic

Član broj: 38170
Poruke: 191
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: Adobe PhotoShop nije pisan u Borland C++ Builderu16.05.2005. u 12:25 - pre 230 meseci
Za pocetak pogledaj sajt [url]http://www.gamedev.net/reference/articles/article2007.asp[/url]

Pokusacu da ti dam ideju kako rade filteri i efekti koji se koriste kako u PS tako i u drugim programima za obradu slike.

Brightness/Contrast:
Brightness dodaje na sva tri kanala konstantan offset
Code:
 
R += offset; 
G += offset; 
B += offset;
Clamp( R, G, B );


gde je Clamp funkcija koja vrednosti kanala ogranicava od 0.0-1.0 ili 0-255

Contrast:
linearna funkcija prenosa
Code:
 
R = (R - 128)*contrastFactor + 128;
G = (G - 128)*contrastFactor + 128;
B = (B - 128)*contrastFactor + 128;
Clamp( R, G, B );


Inverzija slike
Code:
 
R = 255 - R;
G = 255 - G;
B = 255 - B;


Posterizacija:
Code:

R = int(R/(255.0f/(float)N))*int(255.0f/(float)N)
...


Kako rade razni blurovi, "izostravanja", detekcije ivica mozes da vidis ako u PS pozoves Filte/Other/Custom...
Npr. za blur unesi u sredisnja polja vrednost
1 1 1
1 1 1
1 1 1
a u scale 9
Filter se ponasa kao integrator - centralni pixel racuna tako da izracuna srenju vrednost okolnih boja.

Algoritmi kolor transformacija su opisani npr. na [url]http://www.cvl.iis.u-tokyo.ac.jp/~miyazaki/tech/teche01.html[/url]

Medijan filter (po secanju:) ) radi tako sto matricu 3x3 piksela (primer za gray scale) sortira u niz od 9 vrednosti v[0]-v[9] i kao rezultat filtriranja uzme vrednost v[4]. Ovaj filter je idealan za otklanjanje "salt-paper" suma.

Ekvivalizacija histograma radi tako sto se napravi histogram slike (primer za gray scale) i napravi se takva prenosna funkcija koja daje sto je moguce ravniji histogram slike (na ovaj nacin se dobije max. kontrastna slika)

Raznim transformacijama koordinata piksela postizu se efekti distorzije slike. Npr. twirl se dobije tako sto posmatraju sfericne koordinate slike (polozaj piksela odredjen uglom i udaljenoscu od centra slike). Uzme se piksel sa polosaja (r, alpha) i preslika se na piksel (r, scaleCoef*r*alpha). Naravno, bolji se rezultati dobiju ako se koristi interpolacija (bilo linearna ili bilinearna ili ....)
Ili, da bi se dobio efekat slican kao refrakcija slike kroz sferu moze se koristiti transformacija (r,alpha)->(sqrt(r), alpha)
...

 
Odgovor na temu

[es] :: C/C++ programiranje :: Adobe PhotoShop nije pisan u Borland C++ Builderu

[ Pregleda: 3549 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.