Delphi-PRAXiS

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:

Rollo62 4. Dez 2018 15:04

AW: Bild in Graustufen umwandeln
 
50 Shades of gray

Und welches ist jetzt das "offiziell" Richtige :stupid:

Neutral General 4. Dez 2018 15:12

AW: Bild in Graustufen umwandeln
 
Zitat:

Zitat von Celi (Beitrag 1420081)
Danke für den Hinweis, doch leider ändert auch das nichts an meinem Problem. :cry:

Poste mal den Code wie er jetzt nach der Änderung ist.
Du kannst den Code auch hier als Text einfügen mit [delphi]-Tags drum rum. Dann hast du hier auch Syntax Highlighting

Redeemer 4. Dez 2018 16:38

AW: Bild in Graustufen umwandeln
 
Mir ist das ganze sowieso suspekt. Mal ein paar Dinge:
  • Als erster Post im Forum ein Post zum Thema Zeigerarithmetik ist seltsam.
  • Totengräberei.
  • Warum ^TRGBTriple und nicht PBytes wie jeder normale Mensch es nutzen würde?
  • Was hat die JPEG-BMP-Methode im Screenshot suchen? (JPEG als Graustufen speichern ist extrem ineffizient. Korrekt wäre PNG Typ 0.)
  • Assign ohne var halte ich für kritisch.
  • Assign auf sich selbst ergibt keinen Sinn.
  • Graustufen produziert ein riesiges Speicherleck.
  • Was soll das mit dem Pixelformat überhaupt bringen?
  • Inc müsste wenn überhaupt als zweiten Parameter 3 haben oder nicht?

Darlo 4. Dez 2018 18:15

AW: Bild in Graustufen umwandeln
 
Zitat:

Zitat von Redeemer (Beitrag 1420097)
Mir ist das ganze sowieso suspekt. Mal ein paar Dinge:
  • Als erster Post im Forum ein Post zum Thema Zeigerarithmetik ist seltsam.
  • Totengräberei.
  • Warum ^TRGBTriple und nicht PBytes wie jeder normale Mensch es nutzen würde?
  • Was hat die JPEG-BMP-Methode im Screenshot suchen? (JPEG als Graustufen speichern ist extrem ineffizient. Korrekt wäre PNG Typ 0.)
  • Assign ohne var halte ich für kritisch.
  • Assign auf sich selbst ergibt keinen Sinn.
  • Graustufen produziert ein riesiges Speicherleck.
  • Was soll das mit dem Pixelformat überhaupt bringen?
  • Inc müsste wenn überhaupt als zweiten Parameter 3 haben oder nicht?

Du hast unter Deinen Bulletpoints Dein Fazit vergessen, oder war das schon im ersten Satz?!

Neutral General 4. Dez 2018 18:42

AW: Bild in Graustufen umwandeln
 
Zitat:

Zitat von Redeemer (Beitrag 1420097)
Mir ist das ganze sowieso suspekt. Mal ein paar Dinge:
  • Warum ^TRGBTriple und nicht PBytes wie jeder normale Mensch es nutzen würde?

Ich gebe dir da bei allen Punkten Recht, aber TRGBTriple ist ein Record extra für diesen Zweck.
Von daher würde ich dir da widersprechen.

Redeemer 4. Dez 2018 19:22

AW: Bild in Graustufen umwandeln
 
Zitat:

Zitat von Neutral General (Beitrag 1420101)
Zitat:

Zitat von Redeemer (Beitrag 1420097)
Mir ist das ganze sowieso suspekt. Mal ein paar Dinge:
  • Warum ^TRGBTriple und nicht PBytes wie jeder normale Mensch es nutzen würde?

Ich gebe dir da bei allen Punkten Recht, aber TRGBTriple ist ein Record extra für diesen Zweck.
Von daher würde ich dir da widersprechen.

Aber TRGBTriple ist ein einzelnes Element. Ich würde ja eher einen Array-Typ nehmen. Zur Not eben Delphi-Referenz durchsuchenVcl.Imaging.GIFImg.PBGRArray oder so.

Blup 7. Dez 2018 08:54

AW: Bild in Graustufen umwandeln
 
  • In "Graustufen()" gehört das "end" der äußeren "for"-Schleife hinter das "end" der inneren "for"-Schleife.
    (Alles ordentlich einrücken, dann passieren solche Fehler nicht.)
  • In "Graustufen()" "bitmap.Assign(bitmap);" ist Unsinn und eine mögliche Fehlerquelle.
  • In "B_GraustufenClick() zum Schluss "image1.Invalidate" aufrufen, um die Änderung sichtbar zu machen.
  • Das Setzen des Pixelformats gehört eher in "Graustufen()".

bernau 7. Dez 2018 09:52

AW: Bild in Graustufen umwandeln
 
Zitat:

Zitat von Celi (Beitrag 1420075)
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.

Schon mal mit dem Debugger schritt für Schritt durch den Code gegangen? Damit wirst du schnell sehen, welches End an der falschen stelle steht.

bernau 7. Dez 2018 09:53

AW: Bild in Graustufen umwandeln
 
Zitat:

Zitat von Redeemer (Beitrag 1420097)
Mir ist das ganze sowieso suspekt. Mal ein paar Dinge:
  • Assign ohne var halte ich für kritisch.

Warum? Das musst du mir erklären.

Dennis07 10. Dez 2018 03:25

AW: Bild in Graustufen umwandeln
 
Zitat:

Zitat von Redeemer (Beitrag 1420097)
Als erster Post im Forum ein Post zum Thema Zeigerarithmetik ist seltsam.

????

Zitat:

Zitat von Redeemer (Beitrag 1420097)
Warum ^TRGBTriple und nicht PBytes wie jeder normale Mensch es nutzen würde?

Wattt? Wenn "jeder normale Mensch" für dich nur du selber bist, dann vielleicht. Aber alle "normalen Menschen" die ich kenne benutzen TRGBTriple.

Zitat:

Zitat von Redeemer (Beitrag 1420097)
Assign ohne var halte ich für kritisch.

Wiebitte? Was genau meinst du?

Ansonsten kann ich dir nur zustimmen. Aber wäre wirklich nett, wenn du mir mal etwas Erleuchtung bringst, ich blicke da manchmal nicht recht was du sagen willst.

bernhard_LA 19. Feb 2019 21:12

AW: Bild in Graustufen umwandeln
 
kleine Ergänzung

obige beiträge zielen immer auf DELPHI + VCL Framework ab
es gibt aber noch die Option DELPHI + FMX Framework ,

Ein Demo Projekt um Schwarz- Weiss Bilder zu erzeugen gibt es hier : https://github.com/ImageProcessingFMX/SimpleDemo
Der Code funktioniert dann auch unter LINUX etc.

EWeiss 20. Feb 2019 07:23

AW: Bild in Graustufen umwandeln
 
Zitat:

Schwarz- Weiss Bilder
Was denn "Schwarz- Weiss" oder Graustufen? zumindest sind es 256 werte nicht nur 2 ($FFFFFF + $F000000)

Und GetPixel\SetPixel? Kein Ahnung wie schnell das unter LINUX\FMX ist jedenfalls unter Windows um einiges lahmer.
Das sollte auch unter Linux laufen oder kennt Linux kein ASM sollte mich doch schwer wundern.

Delphi-Quellcode:
function TSkinEngine.Rgb2Gray(RGBValue: COLORREF): COLORREF; stdcall;
asm
  movzx  edx, al
  imul   edx, 19595  //Red
  movzx  ecx, ah
  imul   ecx, 38470  //Greean
  shr    eax, 16
  imul   eax, 7471   //Blue
  add    eax, ecx
  add    eax, edx
  shr    eax, 16
  mov    ah, al
  shl    eax, 8
  mov    al, ah
end;
und FMX.

grusss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 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