Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbwert zu Dezimal (https://www.delphipraxis.net/200198-farbwert-zu-dezimal.html)

EWeiss 28. Mär 2019 02:39


Farbwert zu Dezimal
 
kleine frage
wäre das korrekt?

SpectrumData2D[X, Y] definiert als byte
a definiert als byte

Delphi-Quellcode:
//a := (((SpectrumData2D[X, Y] and $FF000000) div $1000000) and 255);
a := ((SpectrumData2D[X, Y] shl 24) and 255);
sollte dann der Alpha wert sein wenn richtig.

was ist dieses $1000000 bzw.. wie muss ich das zuordnen. Ist der wert noch von nöten bei Shl 24?

Delphi-Quellcode:
$FF000000

Ist klar Schwarz ohne Alphawert. Kann ich mir sparen wenn ich um 24Bit verschiebe oder?


Ich muss das auf vernünftige Farbberechnung umlegen das mit den HEX ist alles nicht so das richtige.
Überlauf unsigned.. signed. Und dann den richtigen DatenTyp dafür noch finden.
Damit kann ich nichts anfangen.

Delphi-Quellcode:
  case FEffect of
    0:
      begin
        d := round(Fade * 255);

        for Y := 0 to h do
        begin
          for X := 0 to w do
          begin
            a := (((SpectrumData2D[X, Y] and $FF000000) div $1000000) and 255);
            a := a - d;

            if a < 0 then
              a := 0;

            c := SpectrumData2D[X, Y] and $FFFFFF;

            if a > 127 then
              SpectrumData2D[X, Y] := c or ((a - 256) * $1000000)
            else
              SpectrumData2D[X, Y] := c or (a * $1000000);
          end;
        end;
      end;
  end;
Könnte dabei bitte jemand helfen?

Mein Ansatz.
Delphi-Quellcode:
  case FEffect of
    0:
      begin
        d := round(Fade * 255);

        for Y := 0 to h do
        begin
          for X := 0 to w do
          begin
            //a := (((SpectrumData2D[X, Y] and $FF000000) div $1000000) and 255);
            a := ((SpectrumData2D[X, Y] shl 24) and 255);
            a := a - d;

            // brauche ich nicht Byte gehen niemals ins minus.
            //if a < 0 then
            //  a := 0;

            // c := SpectrumData2D[X, Y] and $FFFFFF;
            c := SpectrumData2D[X, Y] and RGB(255, 255, 255);

            if a > 127 then
              SpectrumData2D[X, Y] := c or ((a - 256) * $1000000) // hier komm ich nicht klar wegen den $1000000
            else
              SpectrumData2D[X, Y] := c or (a * $1000000); // hier komm ich nicht klar wegen den $1000000 
          end;
        end;
      end;
  end;
Wie kann ich die 2 Kommentierten Zeilen shiften?

gruss

Klaus01 28. Mär 2019 05:29

AW: Farbwert zu Dezimal
 
..ist noch früh aber solltest Du nicht nach rechts shiften?
Du willst aus einem 32bit Value das Highbyte haben.

Grüße Klaus

EWeiss 28. Mär 2019 05:32

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Klaus01 (Beitrag 1428957)
..ist noch früh aber solltest Du nicht nach rechts shiften?
Du willst aus einem 32bit Value das Highbyte haben.

Grüße Klaus

Danke ja du hast recht. Da gibt es keine Entschuldigung :duck:

gruss

Klaus01 28. Mär 2019 06:31

AW: Farbwert zu Dezimal
 
.. kein Problem.

Delphi-Quellcode:
            if a > 127 then
              SpectrumData2D[X, Y] := c or ((a - 256) * $1000000) // hier komm ich nicht klar wegen den $1000000
            else
              SpectrumData2D[X, Y] := c or (a * $1000000); // hier komm ich nicht klar wegen den $1000000
          end;
sollte in etwas so aussehen:
Delphi-Quellcode:
            if a > 127 then
              SpectrumData2D[X, Y] := c or ((a - 256) shl 24) // hier wird ein Byte zu einem 32Bit Value
            else
              SpectrumData2D[X, Y] := c or (a shl 24); //dito * $1000000 verschiebt um 24bit nach links
          end;

Grüße
Klaus

EWeiss 28. Mär 2019 07:03

AW: Farbwert zu Dezimal
 
Zitat:

//dito * $1000000 verschiebt um 24bit nach links
Danke Klaus genau das wollte ich wissen, natürlich auch um die Lösungen ;)

Warum jetzt ShiftLeft? r, g, b nach Links?

Ein anderes kannst du bitte noch mal drüber schauen?

Delphi-Quellcode:
    1:
      begin
        d := round(Fade * 10);
        for Y := 0 to h do
        begin
          for X := 0 to w do
          begin
            if (X > 0) and (Y > 0) and (X < w - 1) and (Y < h - 1) then
            begin
              r := 0;
              g := 0;
              b := 0;
              a := 0;

              for dy := -1 to 1 do
              begin
                for dx := -1 to 1 do
                begin
                  c := SpectrumData2D[X + dx, Y + dy];
                  //a := a + (Int64((c and $FF000000) div $1000000) And 255);
                  a := a + (c shr 24) and 255;
                  //r := r + (c and $FF0000) div $10000;
                  r := r + (c and RGB(255, 0, 0)) div 65536;
                  //g := g + (c and $FF00) div $100;
                  g := g + (c and 65280) div 256;
                  b := b + (c and 255);
                end;
              end;

              r := r div 9;
              g := g div 9;
              b := b div 9;
              a := a div 9 - d;

              c := b or (g * $100) or (r * $10000);

              if a > 127 then
                SpectrumData2D[X, Y] := c or ((a - 256) shl 24)
              else
                SpectrumData2D[X, Y] := c or (a shl 24);
            end
            else
              SpectrumData2D[X, Y] := 0;
          end;
        end;
      end;
gruss

EWeiss 28. Mär 2019 11:18

AW: Farbwert zu Dezimal
 
Könnte mir jemand sagen ob das jetzt so in Ordnung ist?
Denn so richtig kommt da bei mir nichts an.

Das ist das letzte.

Delphi-Quellcode:
      begin
        d := round(Fade * 64);
        Buf := SpectrumData2D;

        if FSymmetrical then
        begin
          o := 0;
          s := w * 2;
        end
        else
        begin
          o := 0.5;
          s := w;
        end;

        for Y := 0 to h do
        begin
          for X := 0 to w do
          begin
            if (X > h) or (Y > w) then
              continue;

            cx := X / s - o;
            cy := Y / h - 0.5;

            r := round(Sqrt(cx * cx + cy * cy));

            dx := round((cx + o + 0.01 * cx * ((r - 1) / 0.5)) * s);
            dy := round((cy + 0.5 + 0.01 * cy * ((r - 1) / 0.5)) * h);

            //a := ((Buf[dx, dy] and $FF000000) div $1000000) and 256) - d;
            a := ((Buf[dx, dy] shr 24) and 256) - d; // muss 256 hier addiert werden oder nicht!

            //c := Buf[dx, dy] and $FFFFFF;
            c := Buf[dx, dy] and RGB(255, 255, 255);

            if a > 127 then
              // SpectrumData2D[X, Y] := c or ((a - 256) * $1000000)
              SpectrumData2D[X, Y] := c or ((a - 256) shl 24)
            else
              // SpectrumData2D[X, Y] := c or (a * $1000000);
              SpectrumData2D[X, Y] := c or (a shl 24);
          end;
        end;
      end;
gruss

Klaus01 28. Mär 2019 11:22

AW: Farbwert zu Dezimal
 
.. wieso rechnest Du mit 256 - $FF entspricht 255

Delphi-Quellcode:
 a := ((Buf[dx, dy] shr 24) and 256) - d; // muss 256 hier addiert werden oder nicht!
es werden hier nicht 256 addiert - das ist eine logische Verknüpfung.
Hier wird schlicht eine Wert maskiert, vor dem "and " war der Value noch 32bit breit
mit der makierung wird erreicht das er nur noch 8Bit breit ist.

Daher nehme ich auch an, dass mit 255 maskiert werden sollte.

Grüße
Klaus

EWeiss 28. Mär 2019 11:31

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Klaus01 (Beitrag 1428993)
.. wieso rechnest Du mit 256 - $FF entspricht 255

Delphi-Quellcode:
 a := ((Buf[dx, dy] shr 24) and 256) - d; // muss 256 hier addiert werden oder nicht!
es werden hier nicht 256 addiert - das ist eine logische Verknüpfung.
Hier wird schlicht eine Wert maskiert, vor dem "and " war der Value noch 32bit breit
mit der makierung wird erreicht das er nur noch 8Bit breit ist.

Daher nehme ich auch an, dass mit 255 maskiert werden sollte.

Grüße
Klaus

Weil &H100 256 ist.
Und das steht bei ihm so im Quelltext. Delphi $100
An welcher stelle meinst du denn insbesondere?

Das ist der original source
Code:
//a := ((Buf[dx, dy] and $FF000000) div $1000000) and 256) - d;
gruss

Klaus01 28. Mär 2019 11:37

AW: Farbwert zu Dezimal
 
Delphi-Quellcode:
a := ((Buf[dx, dy] shr 24) and 256) - d
Code:
$AAbbggrr shr 24
$000000AA and $FF
$AA
wenn Du 256 verwendst - passt das nicht in ein Byte


Code:
$AAbbggrr shr 24
$000000AA and $100
$000
Grüße
Klaus

EWeiss 28. Mär 2019 11:42

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Klaus01 (Beitrag 1428998)
Delphi-Quellcode:
a := ((Buf[dx, dy] shr 24) and 256) - d
Code:
$AAbbggrr shr 24
$000000AA and $FF
$AA
wenn Du 256 verwendst - passt das nicht in ein Byte


Code:
$AAbbggrr shr 24
$000000AA and $100
$000
Grüße
Klaus

Ja sorry Klaus das ist nicht aus meinem Mist gewachsen.
Es ist so vom Original übernommen.

Werde mir das nochmal genauer ansehen.

gruss

Klaus01 28. Mär 2019 12:02

AW: Farbwert zu Dezimal
 
Delphi-Quellcode:
var
  test32Bit: cardinal;
  test8Bit: Byte;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    test32Bit := $ABCDEF89;
    test8Bit := (test32Bit shr 24) and $FF;
    writeLn(intToHex(test8Bit));

    test32Bit := $ABCDEF89;
    test8Bit := ((test32Bit and $FF000000) div $1000000) and 255;
    writeln(intToHex(test8Bit));
    readLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
Erebnis:
AB
AB

Delphi-Quellcode:
var
  test32Bit: cardinal;
  test8Bit: Byte;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    test32Bit := $ABCDEF89;
    test8Bit := (test32Bit shr 24) and $FF;
    writeLn(intToHex(test8Bit));

    test32Bit := $ABCDEF89;
    test8Bit := ((test32Bit and $FF000000) div $1000000) and 256;
    writeln(intToHex(test8Bit));
    readLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Ergebnis:
AB
00

Grüße
Klaus

EWeiss 28. Mär 2019 12:04

AW: Farbwert zu Dezimal
 
Ja Klaus..
Ich habe nicht behauptet das du falsch liegst sondern das es so im Original steht es ist mir nur nicht aufgefallen. :)

gruss

Neutral General 28. Mär 2019 13:06

AW: Farbwert zu Dezimal
 
Hab dem Thread grad nur überflogen aber ich gehe davon aus, dass es immer noch nicht wirklich klappt?
Denn wenn SpectrumData2D ein Byte-Array (:!:) ist und du 8 oder mehr Bits in irgendeine Richtung shiftest kommt immer 0 raus!

Was ist jetzt genau in SpectrumData2D enthalten? RGBA-Daten, 32 Bit Farbtiefe?
In dem Fall würden SpectrumData2D[X, Y], SpectrumData2D[X+1, Y], SpectrumData2D[X+2, Y] und SpectrumData2D[X+3, Y] zusammen den RGAB-Wert des X-ten Pixels der Y-ten Zeile darstellen.
Weiß jetzt nicht zu 100% wie die Reihenfolge der Farbwerte ist, aber der Alphawert steht entweder in SpectrumData2D[X, Y] oder SpectrumData2D[X+3, Y].
In dem Fall ist gar keine Bitschieberei notwendig. Falls meine Annahmen falsch sind, dann erklär bitte nochmal was für Daten genau vorliegen.

EWeiss 28. Mär 2019 18:37

AW: Farbwert zu Dezimal
 
Zitat:

In dem Fall ist gar keine Bitschieberei notwendig. Falls meine Annahmen falsch sind, dann erklär bitte nochmal was für Daten genau vorliegen.
Ich muss schieben bzw.. möchte es umlegen weil ich auf der Basis Probleme mit der Berechnung habe.
unsigned - signend und Überläufe sind die Folge, hin und her Konvertierungen.

Zitat:

Was ist jetzt genau in SpectrumData2D enthalten? RGBA-Daten, 32 Bit Farbtiefe?
Nach dem erstellen gar nichts die Pixel (Farben werden durch die jeweiligen Effekte erst generiert.)

Das Bitmap wird erstellt in 32Bit und ARGB (PixelFormat32bppARGB) deshalb kann man davon ausgehen das es 32Bit mit ARGB Daten sind.
Wie habe ich anhand der Codeschnipsel der case ja schon gezeigt.

Zitat:

Denn wenn SpectrumData2D ein Byte-Array () ist
Ist in VB als Long definiert kann also vieles sein.. Wenn man sich die ganze Konvertierungen sparen will bietet sich am besten Int64 an
ansonsten gibt es Überläufe.

gruss

Michael II 28. Mär 2019 19:17

AW: Farbwert zu Dezimal
 
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?

EWeiss 28. Mär 2019 19:26

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Michael II (Beitrag 1429041)
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?

Hier kann man ja sehen das ich auf Int64 Casten musste weil der zu berechnende Wert nicht in einen Integer passt.
Delphi-Quellcode:
a + (Int64((c and $FF000000) div $1000000) And 255);


Daher glaube ich nicht das man hier DWORD nehmen kann. Oder?

gruss

Klaus01 28. Mär 2019 19:34

AW: Farbwert zu Dezimal
 
Nö, das bleiben 32Bit Werte, wenn c ein 32Bit Wert ist.

32Bit and $FF000000 bleibt ein 32Bit Wert, c wird nur mit $FF000000 maskiert.
Anschließend 24Bit nach rechts verschoben. Links von dem verschoben Wert stehen Nullen.
Es ist aber weiterhin ein 32Bit Wert.
mit and $FF wird er zu einem Byte.

Grüße
Klaus

EWeiss 28. Mär 2019 19:38

AW: Farbwert zu Dezimal
 
gibt doch mal
Zitat:

a + (Int64((c and $FF000000) div $1000000) And 255);
in deinem Konsolen Programm ein Ohne Int64 was sagt der Compiler?
Definiere aber vorher c als Integer.

Oder auf was wolltest du hinaus?

In VB bei seiner Berechnung bekomme ich auch negative werte!
Kann DWORD = Cardinal = ColorRef minus werte? Nein und genau das ist mein Problem hier wieder den richtigen DatenTyp zu finden der mit seinen Berechnungen übereinstimmt.
Ist das gleiche wie mit dem FFT der mag unter VB seine Berechtigung haben ist aber unter Delphi so nicht anwendbar.
Wie gesagt es gibt hier fast nur Long..

Deshalb möchte ich alle HEX werte auf normale Farbberechnung umlegen.
Ich muss @Neutral General recht geben Byte ist definitiv der falsche DatenTyp.


gruss

p80286 28. Mär 2019 20:25

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von EWeiss (Beitrag 1429042)
Zitat:

Zitat von Michael II (Beitrag 1429041)
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?

Hier kann man ja sehen das ich auf Int64 Casten musste weil der zu berechnende Wert nicht in einen Integer passt.
Delphi-Quellcode:
a + (Int64((c and $FF000000) div $1000000) And 255);


Daher glaube ich nicht das man hier DWORD nehmen kann. Oder?

gruss

Wenn ich ich jetzt nicht verzählt habe dann ist $FF000000 und $1000000 ein 24Bit Wert, warum sollten die beiden nicht mit einem unsigned 32Bit Typ abgedeckt werden können?
Ausserdem
Delphi-Quellcode:
a+(c shr 6)
sollte das gleiche sein wie der obige Ausdruck. (hoffe ich hab mich bei den Bits nicht verzählt)
[ggf muß Du noch mit $FF maskieren]

Gruß
K-H

EWeiss 28. Mär 2019 20:36

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von p80286 (Beitrag 1429047)
Zitat:

Zitat von EWeiss (Beitrag 1429042)
Zitat:

Zitat von Michael II (Beitrag 1429041)
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?

Hier kann man ja sehen das ich auf Int64 Casten musste weil der zu berechnende Wert nicht in einen Integer passt.
Delphi-Quellcode:
a + (Int64((c and $FF000000) div $1000000) And 255);


Daher glaube ich nicht das man hier DWORD nehmen kann. Oder?

gruss

Wenn ich ich jetzt nicht verzählt habe dann ist $FF000000 und $1000000 ein 24Bit Wert, warum sollten die beiden nicht mit einem unsigned 32Bit Typ abgedeckt werden können?
Ausserdem
Delphi-Quellcode:
a+(c shr 6)
sollte das gleiche sein wie der obige Ausdruck. (hoffe ich hab mich bei den Bits nicht verzählt)
[ggf muß Du noch mit $FF maskieren]

Gruß
K-H

Weil der Compiler diese Meldung ausspuckt.
[DCC Warning] uSpectrum.pas(843): W1024 Combining signed and unsigned types - widened both operands

Delphi-Quellcode:
a := a + (((c and $FF000000) div $1000000) And 255);


SpectrumData2D Array als DWord definiert
a,r,g,b als DWord definiert.

Auch wenn es nur Warnungen sind sie verfälschen das Endergebnis.
Bei der Ausführung gibt es eine Range check error weil DWord nun mal keine negativen werte verträgt.

Und besagten Integerüberlauf.
Delphi-Quellcode:
SpectrumData2D[X, Y] := c or ((a - 256) shl 24)


Obwohl schon geändert..

DWord ist also der falsche DatenTyp!

gruss

Klaus01 29. Mär 2019 05:34

AW: Farbwert zu Dezimal
 
.. in VB6 ist long ein signed 32bit Datentyp.
Ab VB2005 ist long ein signed 64bit Datentyp.

Grüße Klaus

EWeiss 29. Mär 2019 05:40

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Klaus01 (Beitrag 1429054)
.. in VB6 ist long ein signed 32bit Datentyp.
Ab VB2005 ist long ein signed 64bit Datentyp.

Grüße Klaus

Habe nochmal drüber geschlafen.
Es geht hier um die Berechnung von Farben von daher ist Byte falsch und ColorRef oder DWord wie man's nimmt richtig.
Muss nur schauen warum der Compiler bei der Umlegung und dem Original so viele Fehler\Warnungen ausgibt.

gruss

EWeiss 29. Mär 2019 05:58

AW: Farbwert zu Dezimal
 
Ich poste nochmal das Original..
Mir geht es darum die Hex werte mit einer Bit Verschiebung zu ersetzen.

Code:
' Ïðîöåäóðà àíèìèðóåò ôîí
Private Sub Release()
    Dim x As Long, y As Long, c As Long, d As Long, w As Long, h As Long
    Dim r As Long, g As Long, b As Long, a As Long, dx As Long, dy As Long
    Dim cx As Single, cy As Single, Buf() As Long, o As Single, s As Single
   
    ' Îïðåäåëÿåì øèðèíó è âûñîòó ðèñóíêà - 1
    h = UBound(imgSpectrumData, 2): w = UBound(imgSpectrumData, 1)
   
    '  çàâèñèìîñòè îò ýôôåêòà
    Select Case mEffect
    Case 0
        ' ==========Áåç ýôôåêòà (ïðîñòî èçìåíÿåì ïðîçðà÷íîñòü ôîíà)=========
        ' Îïðåäåëÿåì êîýôôèöèåíò èçìåíåíèÿ àëüôà êîìïîíåíòû
        d = Fade * 255
        ' Ïðîõîä ïî áèòàì ðèñóíêà
        For y = 0 To h: For x = 0 To w
            ' Ïîëó÷àåì àëüôó
            a = (((imgSpectrumData(x, y) And &HFF000000) \ &H1000000) And &HFF&)
            ' Óìåíüøàåì
            a = a - d
            ' Îãðàíè÷èâàåì
            If a < 0 Then a = 0
            ' Âûäåëÿåì òîëüêî êîìïîíåíòû öâåòà
            c = imgSpectrumData(x, y) And &HFFFFFF
            ' Çàïèñûâàåì íàçàä ñ èçìåíåííîé àëüôîé
            If a > 127 Then
                imgSpectrumData(x, y) = c Or ((a - 256) * &H1000000)
            Else: imgSpectrumData(x, y) = c Or (a * &H1000000)
            End If
        Next: Next
    Case 1
        ' ===========================Ðàçìûòèå================================
        ' Îïðåäåëÿåì êîýôôèöèåíò èçìåíåíèÿ àëüôà êîìïîíåíòû
        d = Fade * 10
        ' Ïðîõîä ïî áèòàì ðèñóíêà
        For y = 0 To h: For x = 0 To w
            ' Ðàçìûâàåì âíóòðè (1,1,w-1,h-1)
            If x > 0 And y > 0 And x < w - 1 And y < h - 1 Then
                ' Îáíóëÿåì çíà÷åíèÿ íàêîïëåíèÿ êîìïîíåíò
                r = 0: g = 0: b = 0: a = 0
                ' Ïðîõîä ïî ñîñåäíèì ïèêñåëÿì
                For dy = -1 To 1: For dx = -1 To 1
                    ' Âûäåëÿåì êàæäóþ êîìïîíåíòó è çàïèñûâàåì â àêêóìóëÿòîðû
                    c = imgSpectrumData(x + dx, y + dy)
                    a = a + (((c And &HFF000000) \ &H1000000) And &HFF&)
                    r = r + (c And &HFF0000) \ &H10000
                    g = g + (c And &HFF00&) \ &H100
                    b = b + (c And &HFF)
                Next: Next
                ' Óñðåäíÿåì çíà÷åíèÿ â àêêóìóëÿòîðàõ è óìåíüøàåì àëüôó
                r = r \ 9: g = g \ 9: b = b \ 9: a = a \ 9 - d
                ' Îãðàíè÷èâàåì àëüôó ñíèçó
                If a < 0 Then a = 0
                ' Íàõîäèì çíà÷åíèÿ â RGB
                c = b Or (g * &H100&) Or (r * &H10000)
                ' Äîáàâëÿåì àëüôó
                If a > 127 Then
                    imgSpectrumData(x, y) = c Or ((a - 256) * &H1000000)
                Else: imgSpectrumData(x, y) = c Or (a * &H1000000)
                End If
                ' Èíà÷å îáíóëÿåì (ïîëíîñòüþ ïðîçðà÷íûé)
            Else: imgSpectrumData(x, y) = 0
            End If
        Next: Next
    Case 2
        ' ============================Ãîðåíèå================================
        ' Îïðåäåëÿåì êîýôôèöèåíò èçìåíåíèÿ àëüôà êîìïîíåíòû
        d = Fade * 64
        ' Êîïèðóåì áèòû ðèñóíêà â áóôåð
        Buf = imgSpectrumData
        ' Âû÷èñëÿåì ñäâèãè è øèðèíó â çàâèñèìîñòè îò îòîáðàæåíèÿ
        If mSymmetrical Then o = 0: s = w * 2 Else o = 0.5: s = w
        ' Ïðîõîä ïî áèòàì ðèñóíêà
        For y = 0 To h: For x = 0 To w
            ' Òðàíñôîðìèðóåì êîîðäèíàòó â çàâèñèìîñòè îò öåíòðà
            cx = x / s - o: cy = y / h - 0.5
            ' Íàõîäèì äëèíó îòíîñèòåëüíî öåíòðà
            r = Sqr(cx * cx + cy * cy)
            ' Íàõîäèì ðåçóëüòòèðóþùèé ïèêñåëü
            dx = (cx + o + 0.01 * cx * ((r - 1) / 0.5)) * s
            dy = (cy + 0.5 + 0.01 * cy * ((r - 1) / 0.5)) * h
            ' Íàõîäèì è óìåíüøàåì åãî àëüôó
            a = (((Buf(dx, dy) And &HFF000000) \ &H1000000) And &HFF&) - d
            ' Îãðàíè÷èâàåì àëüôó ñíèçó
            If a < 0 Then a = 0
            ' Âûäåëÿåì òîëüêî êîìïîíåíòû öâåòà
            c = Buf(dx, dy) And &HFFFFFF
            ' Çàïèñûâàåì íàçàä ñ èçìåíåííîé àëüôîé
            If a > 127 Then
                imgSpectrumData(x, y) = c Or ((a - 256) * &H1000000)
            Else: imgSpectrumData(x, y) = c Or (a * &H1000000)
            End If
        Next: Next
    End Select
End Sub
Wenn hier jetzt Fehler sind dann sind sie nicht aus meinem Mist gewachsen
destotrotz möchte ich das fertig machen damit die Effekte funktionieren und ich das TrickSpectrum Projekt abschließen kann.


gruss

Michael II 29. Mär 2019 06:57

AW: Farbwert zu Dezimal
 
In Delphi kannst du den ersten Teil so schreiben:

Delphi-Quellcode:
a,d: DWORD;
imgSpectrumData: Array of Array of DWORD;

...

 a := imgSpectrumData[x, y] shr 24; // Alpha bestimmen
 if a >= d then a := a-d else a=0; // Alpha ändern
 c := imgSpectrumData[x,y] and $00ffffff; // nur RGB
 imgSpectrumData[x,y] := (a shl 24) or c; // Neues Alpha und RGB zurückschreiben

EWeiss 29. Mär 2019 07:09

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Michael II (Beitrag 1429062)
In Delphi kannst du den ersten Teil so schreiben:

Delphi-Quellcode:
a,d: DWORD;
imgSpectrumData: Array of Array of DWORD;

...

 a := imgSpectrumData[x, y] shr 24; // Alpha bestimmen
 if a >= d then a := a-d else a=0; // Alpha ändern
 c := imgSpectrumData[x,y] and $00ffffff; // nur RGB
 imgSpectrumData[x,y] := (a shl 24) or c; // Neues Alpha und RGB zurückschreiben

Super Danke ein Problem weniger.

gruss

Klaus01 29. Mär 2019 07:50

AW: Farbwert zu Dezimal
 
.. ein Versuch:
Delphi-Quellcode:
var
  imgSpectrum: Array[0..9,0..9] of Integer;
  h,w: Integer;
  x, dx ,y, dy: Integer;
  c,d,red,green,blue: Integer;
  alpha: Integer;

  fade: Integer;
  mEffect: Byte;
begin
  try
    h := 9;
    w := 9;
    case mEffect of
      0: begin
           d := fade * 255;
           for y:= 0 to h do
             for x := 0 to w do
               begin
                 alpha := ((imgSpectrum[x,y] and $FF000000) shr 24) and $FF;
                 alpha := alpha - d;
                 if alpha < 0 then
                   alpha := 0;
                 c := imgSpectrum[x,y] and $FFFFFF;
                 if alpha > 127 then
                   imgSpectrum[x,y] := c or ((alpha -256) shl 24)
                 else
                   imgSpectrum[x,y] := c or (alpha shl 24);
               end;
         end;
      1: begin
            d:= fade * 10;
            for y := 0 to h do
              for x := 0 to w do
                begin
                  if (x > 0) and (y > 0) and (x < (w-1)) and (y < (h -1))then
                    begin
                      red := 0;
                      green := 0;
                      blue := 0;
                      alpha := 0;
                      for dy := -1 to 1 do
                        for dx := -1 to 1 do
                          begin
                            c := imgSpectrum[x+dx,y+dy];
                            alpha := (((c and $FF000000) shr 24) and $FF) + cardinal(alpha);

                            red := red + ((c and $FF0000) shr 16);
                            green := green + (( c and $FF00) shr 8);
                            blue := blue + (c and $FF);
                          end;
                      red := red div 9;
                      green := green div 9;
                      blue := blue div 9;
                      alpha := (alpha div 9) - d
                      if alpha < 0 then
                        alpha := 0;
                      c := blue or ( green shl 8) or (red shl 16);
                      if alpha > 127 then
                        imgSpectrum[x,y] := c or ((alpha -256) shl 24)
                      else
                        imgSpectrum[x,y] := c or (alpha shl 24);               end;
                end;

         end;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Grüße
Klaus

EWeiss 29. Mär 2019 08:05

AW: Farbwert zu Dezimal
 
Danke für deine Mühe es gibt einen AV direkt in der ersten zeile

Delphi-Quellcode:
alpha := ((imgSpectrum[y,y] and $FF000000) shr 24) and $FF;


gruss

Klaus01 29. Mär 2019 08:10

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von EWeiss (Beitrag 1429073)
Danke für deine Mühe es gibt einen AV direkt in der ersten zeile

Delphi-Quellcode:
alpha := ((imgSpectrum[y,y] and $FF000000) shr 24) and $FF;
gruss

ein Schreibfehler meinerseits: sollte imgSpectrum[x,y] heißen nit [y,y]

Grüße
Klaus

EWeiss 29. Mär 2019 08:24

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Klaus01 (Beitrag 1429074)
Zitat:

Zitat von EWeiss (Beitrag 1429073)
Danke für deine Mühe es gibt einen AV direkt in der ersten zeile

Delphi-Quellcode:
alpha := ((imgSpectrum[y,y] and $FF000000) shr 24) and $FF;
gruss

ein Schreibfehler meinerseits: sollte imgSpectrum[x,y] heißen nit [y,y]

Grüße
Klaus

Kein Problem ;)
Aber nein funktioniert nicht komme niemals über 127 hinweg.

PS:
Danke für euer Interesse denke muss es aufgeben komme auf keinen grünen zweig.
Man kann es drehen wie man will aber die Berechnung von VB lässt sich scheinbar auf Delphi auch in geänderter Form nicht umlegen.
Er wendet da ein paar Tricks an die so einfach nicht nachvollziehbar sind.

gruss

Neutral General 29. Mär 2019 09:12

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von EWeiss (Beitrag 1429076)
PS:
Danke für euer Interesse denke muss es aufgeben komme auf keinen grünen zweig.
Man kann es drehen wie man will aber die Berechnung von VB lässt sich scheinbar auf Delphi auch in geänderter Form nicht umlegen.
Er wendet da ein paar Tricks an die so einfach nicht nachvollziehbar sind.

Der Code von VB lässt sich definitiv auf Delphi umlegen und das ganz ohne Tricks.
Du solltest dich eventuell mal mit den Datentypen und binären Operationen auseinandersetzen, weil du nicht wirklich genau weißt was du da überhaupt tust.

EWeiss 29. Mär 2019 09:18

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Neutral General (Beitrag 1429081)
Zitat:

Zitat von EWeiss (Beitrag 1429076)
PS:
Danke für euer Interesse denke muss es aufgeben komme auf keinen grünen zweig.
Man kann es drehen wie man will aber die Berechnung von VB lässt sich scheinbar auf Delphi auch in geänderter Form nicht umlegen.
Er wendet da ein paar Tricks an die so einfach nicht nachvollziehbar sind.

Der Code von VB lässt sich definitiv auf Delphi umlegen und das ganz ohne Tricks.
Du solltest dich eventuell mal mit den Datentypen und binären Operationen auseinandersetzen, weil du nicht wirklich genau weißt was du da überhaupt tust.

Danke für den Ratschlag. Du hast ja so recht.
Nur seltsam das meine Projekte soweit alle laufen für jemand der keine Ahnung hat eine respektvolle Leistung.

gruss

Klaus01 29. Mär 2019 09:37

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von EWeiss (Beitrag 1429076)
Zitat:

Zitat von Klaus01 (Beitrag 1429074)
Zitat:

Zitat von EWeiss (Beitrag 1429073)
Danke für deine Mühe es gibt einen AV direkt in der ersten zeile

Delphi-Quellcode:
alpha := ((imgSpectrum[y,y] and $FF000000) shr 24) and $FF;
gruss

ein Schreibfehler meinerseits: sollte imgSpectrum[x,y] heißen nit [y,y]

Grüße
Klaus

Kein Problem ;)
Aber nein funktioniert nicht komme niemals über 127 hinweg.

es hat noch eine Zeile gefehlt:

Delphi-Quellcode:
alpha := (alpha div 9) - d
Habe es oben ergänzt.

Grüße
Klaus

EWeiss 29. Mär 2019 09:45

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Klaus01 (Beitrag 1429084)
Zitat:

Zitat von EWeiss (Beitrag 1429076)
Zitat:

Zitat von Klaus01 (Beitrag 1429074)
Zitat:

Zitat von EWeiss (Beitrag 1429073)
Danke für deine Mühe es gibt einen AV direkt in der ersten zeile

Delphi-Quellcode:
alpha := ((imgSpectrum[y,y] and $FF000000) shr 24) and $FF;
gruss

ein Schreibfehler meinerseits: sollte imgSpectrum[x,y] heißen nit [y,y]

Grüße
Klaus

Kein Problem ;)
Aber nein funktioniert nicht komme niemals über 127 hinweg.

es hat noch eine Zeile gefehlt:

Delphi-Quellcode:
alpha := (alpha div 9) - d
Habe es oben ergänzt.

Grüße
Klaus

Kann sein ändert aber nichts daran es ging um case 0 da wird (alpha div 9) nicht verwendet.
Trotzdem danke..

Tut mir leid das ein Nichtskönner euch mit seinem Problem belästigt hat.. Entschuldigung.
Es gibt immer wieder Leute die viel reden aber zum eigentlichen Thema nichts beitragen.
Müssen sie auch nicht nur dann sollen sie sich bedeckt halten und die Sticheleien gefälligst unterlassen.
Bin sauer!

gruss

Klaus01 29. Mär 2019 10:10

AW: Farbwert zu Dezimal
 
Sauer sein macht Falten..

Setze doch mal eine Breakpoint auf
Delphi-Quellcode:
 alpha := ((imgSpectrum[x,y] and $FF000000) shr 24) and $FF;
Markiere imgSpectrum[x,y], drücke ctrl+F5
das gleiche mache mit alpha.
Editiere die beiden Watcheinträge, und lass sie als Hexwert ausgeben.

Jetzt schau mal was in den imgSpectrum Array drin steht.
.. und was aus alpha wird.

Vielleicht ist es ein Problem Deiner Eingangsdaten..

Wenn ich meine Array mit Quatchwerten belege, dann wird auch ab und an alpha > 127 angefahren.
Delphi-Quellcode:
 for x := 0 to w do
      for y := 0 to h do
        imgSpectrum[x,y] := (random(high(byte)) shl 24) or $00123456;
Grüße
Klaus

EWeiss 29. Mär 2019 10:17

AW: Farbwert zu Dezimal
 
Zitat:

Vielleicht ist es ein Problem Deiner Eingangsdaten..
Welche Eingangsdaten?
Die Daten bzw.. Farben werden doch erst hier erzeugt.
Es ist ein leeres Bitmap was erst beim Rendern mit Farbe gefüllt wird die Funktionen der Effekte addieren dann die zusätzlichen Farbwerte bzw. Manipulieren diese.

siehe!
Zitat:

imgSpectrum[x,y] := (random(high(byte)) shl 24) or $00123456;
erst hier bekommt das Bitmap bzw.. das Array Farbdaten.

PS:
Nur über das Original Projekt kann man erkennen was abgeht. ;)

gruss

Klaus01 29. Mär 2019 10:23

AW: Farbwert zu Dezimal
 
.. ich ging davon aus, das Daten im imgSpectrum vorhanden sind.
Wenn das Array leer ist, bzw mit 0en gefüllt, dann kann alpha nie > 127 sein.
Oder vielleicht, doch das ist dann aber abhängig von "fade".

Grüße
Klaus

EWeiss 29. Mär 2019 10:27

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Klaus01 (Beitrag 1429091)
.. ich ging davon aus, das Daten im imgSpectrum vorhanden sind.
Wenn das Array leer ist, bzw mit 0en gefüllt, dann kann alpha nie > 127 sein.
Grüße
Klaus

Zitat:

Oder vielleicht, doch das ist dann aber abhängig von "fade".
Richtig! Deshalb kann man das nur mit dem Original testen. ;)
Aber das ist schwierig weil das Rendern über eine Callback gesteuert wird unterbrichts du die wird es schwierig da was zu debuggen.

gruss

Klaus01 29. Mär 2019 10:32

AW: Farbwert zu Dezimal
 
.. kannst Du nit die "fade" oder "d" Werte in eine Datei schreiben lassen?

Mit den Werten könnte man die Funktion dann testetn.

Grüße
Klaus

EWeiss 29. Mär 2019 10:36

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Klaus01 (Beitrag 1429096)
.. kannst Du nit die "fade" oder "d" Werte in eine Datei schreiben lassen?

Mit den Werten könnte man die Funktion dann testetn.

Grüße
Klaus

Die hast du doch..
Delphi-Quellcode:
d := round(Fade * 255);


Für das Case 0 also wenn kein Effekt ausgewählt ist.
Fade ist ein wert zwischen 0 und 1 Default 0.81xxxx

gruss

Klaus01 29. Mär 2019 10:49

AW: Farbwert zu Dezimal
 
.. aber wenn d einen wert größer als 0 hat
und alpha so berechnet wird ->
Delphi-Quellcode:
alpha := ((imgSpectrum[x,y] and $FF000000) shr 24) and $FF;
alpha := alpha - d
ist dann nicht alpha immer < 0?

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 Uhr.
Seite 1 von 2  1 2      

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