AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vignette effect

Ein Thema von WojTec · begonnen am 15. Sep 2010 · letzter Beitrag vom 20. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
WojTec

Registriert seit: 17. Mai 2007
482 Beiträge
 
Delphi XE6 Professional
 
#1

Vignette effect

  Alt 15. Sep 2010, 18:57
Hello. I want to draw vignette effect, but don't have idea how to do this? For graphics I'm using GR32. Could you help?

Geändert von WojTec (15. Sep 2010 um 19:11 Uhr) Grund: Bad word used, now correct
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Vintage effect

  Alt 15. Sep 2010, 19:08
What do you think of "vintage Effect"?
Markus Kinzler
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
482 Beiträge
 
Delphi XE6 Professional
 
#3

Re: Vignette effect

  Alt 15. Sep 2010, 19:13
Sorry, I used bad word I mean vignette. I now corrected.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Vignette effect

  Alt 16. Sep 2010, 01:56
You could calculate the brightness of every Pixel with a 2-dimensional Gaussian function.
Here is some Pseudocode:
Delphi-Quellcode:
xcenter := Bitmap.Width div 2;
ycenter := Bitmap.Height div 2;
for each Pixel do
begin
  brightness_factor := mygaussian(x - xcenter, y-ycenter)* 0.5{=effect depth} + 0.3{basic brightness};
  Pixel[x,y].red := Pixel[x,y].red * brightness_factor;
  Pixel[x,y].green := Pixel[x,y].green * brightness_factor;
  Pixel[x,y].blue := Pixel[x,y].blue * brightness_factor;
end;
It it works, you could replace the mygaussian() function with other possibly better functions.
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
482 Beiträge
 
Delphi XE6 Professional
 
#5

Re: Vignette effect

  Alt 16. Sep 2010, 10:21
It's clear all, but not how to implement Gaussian function, I don't understand it too much

Delphi-Quellcode:
function TwoDimensionalGaussian(X, Y: Single): Single;
var
  a, b, c: Single;
begin

end;
I don't know how to "fill" this function. I'm also not sure parameters and result types, Single are correct?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Vignette effect

  Alt 18. Sep 2010, 00:19
I think the following function is faster and easier to understand
than the gaussian function:

Delphi-Quellcode:
function CalcVignetteBrightness(X, Y: Single): Single;
var
  distance : Single;
  inner_radius, outer_radius : Single;
begin
  inner_radius := 50;
  outer_radius := 150;

  // calculate the distance from the origin (center of the image)
  distance := SQRT(SQR(x) + SQR(Y));
  
  if distance <= inner_radius then
    result := 1.0 // Brightness 100%
  else if distance <= outer_radius then
    // decreasing Brightness from 100% downto 0%
    result := (distance - inner_radius) / (outer_radius - inner_radius)
  else
    result := 0.0; // it's dark outside the outer_radius
end;

Geändert von sx2008 (18. Sep 2010 um 00:30 Uhr) Grund: Double -> Single
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
482 Beiträge
 
Delphi XE6 Professional
 
#7

Re: Vignette effect

  Alt 18. Sep 2010, 14:09
This is what I have:

Delphi-Quellcode:
function VignetteBrightness(X, Y: Single): Single;
var
  distance: Single;
  inner_radius, outer_radius: Single;
begin
  inner_radius := 50;
  outer_radius := 150;

  // calculate the distance from the origin (center of the image)
  distance := SQRT(SQR(x) + SQR(Y));

  if distance <= inner_radius then
    result := 1.0 // Brightness 100%
  else if distance <= outer_radius then
    // decreasing Brightness from 100% downto 0%
    result := (distance - inner_radius) / (outer_radius - inner_radius)
  else
    result := 0.0; // it's dark outside the outer_radius
end;

procedure Vignette(ASource: TBitmap32);
var
  Bits: PColor32Entry;
  I, J, XCenter, YCenter: Integer;
  Brightness: Single;
begin
  XCenter := ASource.Width div 2;
  YCenter := ASource.Height div 2;

  Bits := @ASource.Bits[0];

  for J := 0 to ASource.Height - 1 do
  begin
    for I := 0 to ASource.Width - 1 do
    begin
      Brightness := VignetteBrightness(I - XCenter, J - YCenter) * 0.5{=effect depth} + 0.3{basic brightness};

      Bits.R := IntToByte(Round(Bits.R + Brightness));
      Bits.G := IntToByte(Round(Bits.G + Brightness));
      Bits.B := IntToByte(Round(Bits.B + Brightness));

      Inc(Bits);
    end;
  end;

  ASource.Changed;
end;
And no effect - image not changed. Why?
I tried change inner_radius, outer_radius, effect depth and basic brightness, bot no effect too
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Re: Vignette effect

  Alt 18. Sep 2010, 14:43
And no effect - image not changed. Why?
You must multiply with the brightness factor.
And you have to care about arithmetic overflow.

Delphi-Quellcode:
function ClampByte(value:Integer):Byte;
begin
  if value > 255 then
    result := 255
  (* not neccesary when a pixel is multiplied with a positive value
  else if value < 0
    result := 0
  *)

  else
    result := Byte(value);
end;
...
Bits.R := ClampByte(Round(Bits.R * Brightness));
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
482 Beiträge
 
Delphi XE6 Professional
 
#9

Re: Vignette effect

  Alt 18. Sep 2010, 15:30
Ah, of course, that's my mistake
Ok, working, but not exactly as should - darker should be near edges, not center as is now
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Re: Vignette effect

  Alt 18. Sep 2010, 16:19
Ok, working, but not exactly as should - darker should be near edges, not center as is now
Hmm ,there is a little bug:
Delphi-Quellcode:
  else if distance <= outer_radius then
    // decreasing Brightness from 100% downto 0%
// result := (distance - inner_radius) / (outer_radius - inner_radius) // wrong
    result := (outer_radius - distance) / (outer_radius - inner_radius)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz