![]() |
Grauton Kalkulation
Hab hier eine Kalkulation für grautöne im Netz gefunden.
Calcuate grey ![]()
Delphi-Quellcode:
Habe aber 2 kleine probleme was die definition von GetDib* und ptPixels angeht.
nSize := bm.bmWidth * bm.bmHeight;
for IntI := 0 to nSize do begin // 0.212671 * R + 0.715160 * G + 0.072169 * B iSrcR := GetDibR(ptPixels[IntI]); iSrcG := GetDibG(ptPixels[IntI]); iSrcB := GetDibB(ptPixels[IntI]); iGrey := (iSrcR * 54 + iSrcG * 182 + iSrcB * 19) shr 8; // Take color from the gradient Col := m_clGradient[iGrey]; ptPixels[IntI] := RGB( (GetBValue(Col) * iAlpha + iSrcB * (255 - iAlpha)) shr 8, (GetGValue(Col) * iAlpha + iSrcG * (255 - iAlpha)) shr 8, (GetRValue(Col) * iAlpha + iSrcR * (255 - iAlpha)) shr 8 ); end; Übersetzung nach Delphi. In C++
Code:
#define GetDibR(drgb) (((drgb) & 0x00ff0000) >> 16)
#define GetDibG(drgb) (((drgb) & 0x0000ff00) >> 8) #define GetDibB(drgb) ((drgb) & 0x000000ff)
Code:
Wenn jemand näheres darüber weiss nur her damit ;)
UINT* ptPixels;
gruss |
AW: Grauton Kalkulation
Ich bin nicht gerade fit in C/C++, aber das hier müsste grob stimmen.
Delphi-Quellcode:
type
ptPixels = ^UINT; function GetDibR(drgb: DWORD): DWORD; begin Result := (drgb and $00FF0000) shr 16; end; function GetDibG(drgb: DWORD): DWORD; begin Result := (drgb and $0000FF00) shr 8; end; function GetDibB(drgb: DWORD): DWORD; begin Result := drgb and $000000FF; end; |
AW: Grauton Kalkulation
Code:
#define GetDibR(drgb) (((drgb) & 0x00ff0000) >> 16)
#define GetDibG(drgb) (((drgb) & 0x0000ff00) >> 8) #define GetDibB(drgb) ((drgb) & 0x000000ff)
Delphi-Quellcode:
Die vordefinierten Funktionen GetRValue, GetGValue und GetBValue sollten aber an sich das gleiche tun, sofern sie nicht gerade von einer anderen Byte-Order ausgehen (ich vergesse das immer...).
function GetDibR(const drgb: cardinal): cardinal; inline;
begin Result := (drgb and $00ff0000) shr 16; end; function GetDibG(const drgb: cardinal): cardinal; inline; begin Result := (drgb and $0000ff00) shr 8; end; function GetDibB(const drgb: cardinal): cardinal; inline; begin Result := (drgb and $000000ff); end;
Delphi-Quellcode:
ist nichts anderes als ein
UINT*
Delphi-Quellcode:
.
PCardinal
|
AW: Grauton Kalkulation
Danke!
Zitat:
nicht einfach auf ein Array in Delphi auslegen kann. Was bedeutet inline ? Noch nie gehört bzw. verwendet. gruss |
AW: Grauton Kalkulation
"inline" bedeutet nur, das der Compiler versucht, den Funktionsquelltext direkt anstelle des Aufrufes in den Code zu kompilieren. Das erspart Aufruf und Rücksprung, ergo einige CPU-Zyklen. Das Programm wird größer, aber auch schneller.
Soweit ich mich erinnere, habe ich den Grauwert immer durch
Delphi-Quellcode:
hinbekommen
Function GetGray(color : TColor) : TColor;
begin v := (GetRValue(color) + GetGValue(color) + GetBValue(color)) div 3; Result := RGB(v,v,v); end; |
AW: Grauton Kalkulation
Danke euch allen werde mal schaun was die beste Variante ist.
Mein letztes problem weiss nicht wie ich ptPixels als Array auslegen soll. Kann mir nicht vorstellen dass das Array sich im ^UINT befindet. Oder? Einzigste was mir jetzt einfällt die pPixels als Dynamisches Array auszulegen of Cardinal und die neue länge anhand von nSize zuzuweisen. gruss |
AW: Grauton Kalkulation
Zitat:
Delphi-Quellcode:
Array ist, kannst du den Pointer auf das erste Element des Arrays nehmen. Oder du schreibst den Code um und verwendest statt des Pointers einen Index, den du jedes mal inkrementierst, wenn im Originalcode der Pointer inkrementiert wird. Dann musst du immer über den Index auf das Element zugreifen.
packed
Z.B.:
Code:
=>
UINT* pixel;
... ++pixel; // rückt zum nächsten Pixel vor (*pixel) = 0x00ff0000; // färbt das Pixel rot
Delphi-Quellcode:
oder:
var
Pixels: array of cardinal; PixelIdx: integer; PixelIdx := 0; ... inc(PixelIdx); Pixel[PixelIdx] := $00ff0000;
Delphi-Quellcode:
var
Pixels: packed array of cardinal; Pixel: PCardinal; Pixel := @Pixels[0]; ... inc(Pixel); Pixel^ := $00ff0000; Zitat:
Ich habe inline hier aber in erster Linie verwendet, weil Inline-Funktionen in Delphi am ehesten das Equivalent zu Macros in C darstellen – Macros werden nämlich ebenfalls vom C-Compiler vor dem eigentlichen Kompiliervorgang „expandiert“, also direkt an die Stelle im Code eingefügt. Macros sind eben keine Funktionen, sondern halt „Macros“. Wenn du in C ein Macro „aufrufst“, ist das für den Compiler quasi so, als hättest du den Code direkt an der Stelle mit Copy&Paste eingefügt. Und dem kommen Inline-Funktionen halt am nächsten. Hoffe es ist klar :wink: [edit] Zitat:
[/edit] |
AW: Grauton Kalkulation
Um die Helligkeit einer Farbe zu ermitteln werden die Rot, Grün und Blau Anteile unterschiedlich bewertet um dem menschlichen Auge möglichst nahe zu kommen.
Mein Code verwendet dazu die Faktoren 61(rot), 174(grün) und 21(blau):
Delphi-Quellcode:
Die Faktoren 54(rot), 182(grün) und 19(blau) aus dem Codebeispiel im Beitrag#1 dürften ähnliche Ergebnise bringen.
function Intensity(Color: TColor): Integer;
begin Color := ColorToRGB(Color); Result := GetBValue(Color) * 21 // Blue + GetGValue(Color) * 174 // Green + GetRValue(Color) * 61; // Red Result := Result shr 8; end; function GreyColor(Color: TColor):TColor; var i : Integer; begin i := Intensity(Color); Result := RGB(i, i, i); end; Wenn man alle Farbanteile mit 1/3 einrechnet dürfte das Ergebnis leicht unnatürlich aussehen. |
AW: Grauton Kalkulation
Zitat:
Ein ungefährer wert käme auch nicht in frage ;) @NamenLozer Zitat:
Zitat:
Zitat:
gruss |
AW: Grauton Kalkulation
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz