Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild in Graustufen umwandeln (https://www.delphipraxis.net/10914-bild-graustufen-umwandeln.html)

fresh_hotboy 27. Okt 2003 22:32


Bild in Graustufen umwandeln
 
hi zusammen

diese seite hier ist echt supi!!
bin studi und arbeite grade an einem projekt, jedoch benötige ich hierzu ne hilfestellung. kann mir jemand ausführlich sagen wie ich ein bild in Graustufen umwandeln kann? wäre euch da sehr dankbar.

thanks

bin ein delphi anfänger

Mirilin 27. Okt 2003 23:20

Re: Bild in Graustufen umwandeln
 
:hi:

Ich hab im SwissDelphiCenter
Dies hier gefunden :
Delphi-Quellcode:
function*GetGreyScale(red,*blue,*green:*TColor):*TColor;
var* 
**Color:*Integer;
begin
**Color*:=*Round(red***0.56*+*green***0.33*+*blue***0.11);
**Result*:=*RGB(Color,*Color,*Color);
end;
In den Kommentaren zum Beitrag findest du auch noch dies :

Delphi-Quellcode:
Gray:=round((r+g+b)/3);
und
Delphi-Quellcode:
Gray:=round(sqrt(r*r+g*g+b*b));

Burning_Chrome 28. Okt 2003 05:27

Re: Bild in Graustufen umwandeln
 
Hi!

In der Delphi-Source.de steht vom Autor Robert Schiebel folgender code (hab ihn schon mal getestet und er funzt super):

Delphi-Quellcode:
type
  TPixelBMP24 = packed record
    R: byte;
    G: byte;
    B: byte;
end;

var
  SrcBMP, DstBMP24: TBitmap;

procedure TForm1.FormCreate(sender: TObject);
begin
  SrcBMP:=TBitmap.Create; {Src Bitmap erstellen}
  SrcBMP.LoadFromFile('datei'); //sollte 24Bit sein

  DstBMP24:=TBitmap.Create; {24-Bit Dst Bitmap erstellen}
  DstBMP24.PixelFormat:=pf24bit;
  DstBMP24.Width:=SrcBmp.Width;
  DstBMP24.Height:=SrcBmp.Height;
end;

function BMPRGBtoYUV(rgb: TPixelBMP24): TPixelBMP24;
var y,u,v:longint;
begin
  y := rgb.G*150 + rgb.B*29 + rgb.R*77; // 0.587 x 256, 0.114 x 256, 0.299 x 256
  u := (rgb.B shl 8 - y) * 144;        // 0.564 x 256
  v := (rgb.R shl 8 - y) * 183;        // 0,713 x 256
  Result.G :=y shr 8;
  Result.B :=u shr 16 + $80;
  Result.R :=v shr 16 + $80;
end;

function BMPYUVtoRGB(yuv: TPixelBMP24): TPixelBMP24;
var temp: integer;
begin
  temp := yuv.G + (yuv.B - $80) * 256 div 144  ;
  if temp > 0 then Result.B:=temp else Result.B:=0;
  if temp > 255 then Result.B:=255;

  temp := yuv.G + (yuv.R - $80) * 256 div 183  ;
  if temp > 0 then Result.R:=temp else Result.R:=0;
  if temp > 255 then Result.R:=255;

  temp := (yuv.G shl 8 - Result.B*29 - Result.R*77) div 150;
  if temp > 0 then Result.G:=temp else Result.G:=0;
  if temp > 255 then Result.G:=255;
end;

procedure TForm1.Button4Click(Sender: TObject);
var x, y: integer;
  SrcPixel: ^TPixelBMP24;
  DstPixel: ^TPixelBMP24;
  yuv: TPixelBMP24;
begin
  for y:=0 to SrcBMP.Height-1 do  // SrcBMP und DstBMP24 sind gleich groß !!!
  begin
    SrcPixel:=SrcBMP.ScanLine[y];
    DstPixel:=DstBMP24.ScanLine[y];
    for x:=0 to SrcBMP.Width-1 do
    begin
      yuv:=BMPRGBtoYUV(SrcPixel^);
      yuv.R:=$80;
      yuv.B:=$80;
      DstPixel^ := BMPYUVtoRGB(yuv);
      inc(SrcPixel);
      inc(DstPixel);
    end;
  end;

  Image1.Picture.Graphic:=DstBMP24;
end;
Best_Regards
Burning_Chrome

Sanchez 28. Okt 2003 06:48

Re: Bild in Graustufen umwandeln
 
Um für mehr Auswahl zu sorgen:
Delphi-Quellcode:
type PixArray = Array [0..2] of Byte;

procedure GrayScale(helpbmp : TBitmap);
var i, j : integer;
    R, G, B, h : Byte;
    p: ^PixArray;
begin
  helpbmp.PixelFormat := pf24bit;
  for i:=0 to helpbmp.height - 1 do begin
    p := helpbmp.ScanLine[i];
    for j:=0 to helpbmp.width - 1 do begin
      R := p^[2];
      B := p^[1];
      G := p^[0];

      h := (r+b+g) div 3;
      p^[2] := h;
      p^[1] := h;
      p^[0] := h;

      inc(p);
    end;
  end;
end;
grüße, daniel

Burning_Chrome 29. Okt 2003 05:18

Re: Bild in Graustufen umwandeln
 
Hi!

@Sanchez0815:


lediglich das
Delphi-Quellcode:
 h := (r+b+g) div 3;
stoert etwas, da die 'echte' helligkeit so nicht gerechnet werden kann (s.o.)
unsere augen sind nicht fuer alle farben gleich empfindlich.

Best_Regards
Burning_Chrome

fresh_hotboy 12. Nov 2003 16:30

Bild in Graustufen umwandeln
 
hi hi
danke für eure schnelle und professionelle hilfe. habe mich auch selber noch in ein paar büchern schlau gemacht und au ne lösung gefunden. hier möchte ich dies für die nachwelt der nächsten fragenden veröffentlichen :-D

zuerst ne record erstellen:

Delphi-Quellcode:
TRGB = record
               blue  :byte;
               red   :byte;
               green :byte;
           end;
anschliessend:

Delphi-Quellcode:
procedure TForm_Web_Cam.Button_GraustufenClick(Sender: TObject);

var x,y  :integer;
    pixel :^TRGB;
    grau :TColor;

begin
   if BitMap.PixelFormat <> pf24bit then
   begin
      showmessage('Bild ist keine 24-Bitfarben'); //wenn kein 24bit Bild
      exit
   end;


for y:= 0 to BitMap.height-1 do
   begin
      pixel:= BitMap.Scanline[y];
         for x:= 0 to BitMap.width-1 do
            begin
               grau:= HiByte(pixel.red*77+pixel.green*151+pixel.blue*28); //neuzuweisen der farbe
               pixel.red:= grau;
               pixel.blue:= grau;
               pixel.green:= grau;
               inc(pixel)
            end
   end;
PaintBox.refresh     //damit wird die Paintbox nochmal mit dem neuen bild geladen
end;
mein bild ist vom typ bmp, daher BitMap und wird in einer Paintbox gezeichnet.

choose 12. Nov 2003 16:36

Re: Bild in Graustufen umwandeln
 
Danke, fresh_hotboy

Zitat:

Zitat von fresh_hotboy
Delphi-Quellcode:
grau:= HiByte(pixel.red*77+pixel.green*151+pixel.blue*28); //neuzuweisen der farbe

Diesen "Trick" solltest Du dann aber noch "für die Nachwelt" und alle, die sich bisher nicht mit Fixpunktarithmetik beschäftigt haben, dokumentieren.

Celi 4. Dez 2018 14:49

AW: Bild in Graustufen umwandeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich bin neu hier und habe eine Frage zur Umwandlung in Graustufen. :oops:

Mein Quellcode scheint soweit richtig zu sein, das Programm lässt sich ohne weitere Fehlermeldungen öffnen. Allerdings passiert leider gar nichts, wenn man meinen Button benutzt.

Ich vermute es liegt an der Zeile "image1.Picture.Bitmap.PixelFormat:=pf24bit;". Hat jemand einen Tipp bzw. muss ich vorher was zu den 24Bit festlegen und wenn ja wie funktioniert das?:cyclops:


Dankeschön im Voraus. :)

DeddyH 4. Dez 2018 14:51

AW: Bild in Graustufen umwandeln
 
Das End der ersten Schleife gehört hinter das End der zweiten.

Celi 4. Dez 2018 14:58

AW: Bild in Graustufen umwandeln
 
Danke für den Hinweis, doch leider ändert auch das nichts an meinem Problem. :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 Uhr.
Seite 1 von 3  1 23      

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