AGB  ·  Datenschutz  ·  Impressum  







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

Farbwert zu Dezimal

Ein Thema von EWeiss · begonnen am 28. Mär 2019 · letzter Beitrag vom 3. Apr 2019
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 08:12
Zitat:
Sei nicht böse, aber für mich ist dieser Thread Comedy pur.
Kein Problem bin ich nicht.
Ich habe früher alles gewusst.. warum auch immer ich es heute nicht mehr weis mag dahingestellt sein spielt auch keine weitere rolle.

Du hast es gut erklärt und aufgezeigt wo die Fehler liegen und warum es falsch ist so kann ich damit leben.

Die von dir benannten Probleme sind aber mittlerweile Asbach(Vergangenheit, erledigt, behoben) da Michael mich in einer PN schon darauf aufmerksam gemacht hat.
Wenigstens ziehst du nicht über mich her ohne aufzuzeigen wo die Probleme liegen.

Trotz alledem ob Comedy oder nicht keine eurer Versuche(Wissen? ??) hat irgendeine Verbesserung gebracht. Leider.
Die werte sind weiterhin falsch.

@Klaus
Zitat:
. ein 32bit Value and $FF maskiert den 32bit auf ein Byte.
$FFCCDD01 and $FF ($000000FF) ergibt $01
Es wäre nett wenn du mir sagen würdest auf was du dich beziehst.

Zitat:
//a := (((SpectrumData2D[X, Y] and $FF000000) div $1000000) and 255);
Ergibt immer a = 0
Rein Rechnerisch oder deine Annahme
Denn das ist original von VB und die werte ändern sich ständig. (Weil nicht als Byte sondern als Long definiert)
Code:
Dim imgSpectrumData() As Long
Dim r As Long, g As Long, b As Long, a As Long
Code:
a = (((imgSpectrumData(x, y) And &HFF000000) \ &H1000000) And &HFF&)
Zitat:
d := round(Fade * 255);Fade, wenn ich es richtig sehe ist ein Single im Bereich 0 .. 1.
Also ist d (ein Integer) im Bereich 0 .. 255
Wo ist der Widerspruch? Oder das Problem

Code:
Dim d As Long
Fade ist ein property
Code:
Public Property Let Fade(ByVal fNewValue As Single)
Public Property Get Fade() As Single
Du solltest stets dir den vergleich vorher ansehen deine Berechnung erstellen und dann belegen warum etwas falsch ist, sein soll,
wenn genau das im Original alles Funktioniert was du hier als falsch unterstellst. (OK ich habe irrtümlich Byte definiert deshalb ist der wert so wie du sagst)
Keine Ahnung was das mit Comedy zu tun hat.


Zitat:
Warum?!
Wenn Du einen Byte-Wert um 8 oder mehr Bits shiftest, gleichgültig ob links oder rechts und das Ergebnis
mit "and 255" begrenzt wird das Resultat stets 0 sein.
Wurde schon lange behoben.

Ich bin davon ausgegangen das wenn die Funktion GdipCreateBitmapFromScan0 als Übergabe von Scan0 einen Pointer of PByte erwartet das es letztendlich sinnvoll wäre das Array direkt als Byte zu definieren.
Die Nachfolgenden Funktionen wie Release hatte ich zu diesen Zeitpunkt noch nicht übersetzt, konnte also zu dem Zeitpunkt nicht wissen ob der der Datentyp so korrekt ist.
Wie gesagt in VB ist eh fast alles Long.

Versuch doch mal ein Projekt zu übersetzen das zu 80 Prozent aus nur 1 DatenTyp besteht.
Das hier war insbesondere schwierig da es hier ums eingemachte ging siehe FFT.. kennst du die Datentypen nicht fällst du auf die Nase.

Zitat:
Meine Vermutung ist, dass SpectrumData2D ein Array of Array of UInt32 sein sollte und nicht ein Array of Array of Byte
Ja Vermutung nur mit deinem Cardinal in Verbindung mit Bytes a,r,g,b stürzt die Anwendung ab.

gruss

Geändert von EWeiss (30. Mär 2019 um 12:21 Uhr)
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 08:22
@Klaus
Zitat:
. ein 32bit Value and $FF maskiert den 32bit auf ein Byte.
$FFCCDD01 and $FF ($000000FF) ergibt $01
Es wäre nett wenn du mir sagen würdest auf was du dich beziehst.
Hab' mich verlesen/ es falsch verstanden.
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 08:24
@Klaus
Zitat:
. ein 32bit Value and $FF maskiert den 32bit auf ein Byte.
$FFCCDD01 and $FF ($000000FF) ergibt $01
Es wäre nett wenn du mir sagen würdest auf was du dich beziehst.
Hab' mich verlesen/ es falsch verstanden.
Grüße
Klaus
Ach so ok Danke

gruss

Geändert von EWeiss (30. Mär 2019 um 08:33 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.111 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 16:26
Zitat:
.
Zitat:
//a := (((SpectrumData2D[X, Y] and $FF000000) div $1000000) and 255);
Ergibt immer a = 0
Rein Rechnerisch oder deine Annahme
Denn das ist original von VB und die werte ändern sich ständig. (Weil nicht als Byte sondern als Long definiert)
Code:
Dim imgSpectrumData() As Long
Dim r As Long, g As Long, b As Long, a As Long
Code:
a = (((imgSpectrumData(x, y) And &HFF000000) \ &H1000000) And &HFF&)
Rechnerisch!
Natürlich unter der Voraussetzung dass SpectrumData2D[X, Y] ein Byte ist (wie von Dir angegeben und wie auch in Deinem Projekt deklariert)
Beispiel:
SpectrumData2D[X, Y] = $37
Code:
               $00000037
and           $FF000000
=             $00000000
div           $1000000 
=             $00000000
and           $000000FF
=             $00000000

Zitat:
Zitat:
d := round(Fade * 255);Fade, wenn ich es richtig sehe ist ein Single im Bereich 0 .. 1.
Also ist d (ein Integer) im Bereich 0 .. 255
Wo ist der Widerspruch? Oder das Problem
Nirgends ist da ein Widerspruch oder Problem.
Ich hab das nur ausgeführt um aufzuzeigen warum das spätere a := a - d zu einem Wert im Bereich -255 .. 0 führt-

Zitat:
Code:
Dim d As Long
Fade ist ein property
Code:
Public Property Let Fade(ByVal fNewValue As Single)
Public Property Get Fade() As Single
Du solltest stets dir den vergleich vorher ansehen deine Berechnung erstellen und dann belegen warum etwas falsch ist, sein soll,
wenn genau das im Original alles Funktioniert was du hier als falsch unterstellst. (OK ich habe irrtümlich Byte definiert deshalb ist der wert so wie du sagst)
Keine Ahnung was das mit Comedy zu tun hat.
Genau das habe ich getan.
Ich habe mir das genau angesehen und aufgezeigt, warum (im Falle FEffect=0) SpectrumData2D stets unverändert bleibt, was sicher nicht der Sinn der vielen Berechnungen ist.

Zitat:
Zitat:
Meine Vermutung ist, dass SpectrumData2D ein Array of Array of UInt32 sein sollte und nicht ein Array of Array of Byte
Ja Vermutung nur mit deinem Cardinal in Verbindung mit Bytes a,r,g,b stürzt die Anwendung ab.
Du erstellst (in uSpectrum.TSpectrum.CreateSpectrumBitmap) mit der Funktion Gdip_CreateBitmapFromScan0 eine Bitmap und übergibst der Funktion als Pixelformat "PixelFormat32bppARGB" und als Pointer auf die Farbinformationen "PByte(SpectrumData1D[0])", wobei
SpectrumData1D die gleichen Daten enthält wie SpectrumData2D.

PixelFormat32bppARGB sagt, dass die Farbinformationen 32 Bits je Pixel enthalten, je 8 Bits für Alpha, Rot, Grün, Blau.
SpectrumData1D enthält aber nur 1 Byte je Pixel.
Und das kommt Dir nicht komisch vor?

Du sagst auch, dass im Original VB-Code imgSpectrumData() As Long definiert ist.
Ungeachtet dessen definierst Du SpectrumData2D als Array of Array of Byte. (Weil der Parameter Scan0 als PByte definiert ist).
Und auch das kommt Dir nicht komisch vor?

Zu
Zitat:
Ja Vermutung nur mit deinem Cardinal in Verbindung mit Bytes a,r,g,b stürzt die Anwendung ab.
Na ja, einfach nur die Definition von SpectrumData2D von Byte auf Cardinal ändern, reicht natürlich nicht.
Selbstverständlich musst Du dann überall dort, wo Du auf SpectrumData2D zugreifst, Änderungen vornehmen.

Zitat:
Ich bin davon ausgegangen das wenn die Funktion GdipCreateBitmapFromScan0 als Übergabe von Scan0 einen Pointer of PByte erwartet das es letztendlich sinnvoll wäre das Array direkt als Byte zu definieren.
Die Nachfolgenden Funktionen wie Release hatte ich zu diesen Zeitpunkt noch nicht übersetzt, konnte also zu dem Zeitpunkt nicht wissen ob der der Datentyp so korrekt ist.
Wie gesagt in VB ist eh fast alles Long.
Es spricht ja auch nichts dagegen, SpectrumData2D auf Basis Bytes zu definieren, allerdings nicht nur 1 Byte je Pixel sondern 4 Bytes (= 1 UInt32).
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 16:49
Zitat:
PixelFormat32bppARGB sagt, dass die Farbinformationen 32 Bits je Pixel enthalten, je 8 Bits für Alpha, Rot, Grün, Blau.
SpectrumData1D enthält aber nur 1 Byte je Pixel.
Und das kommt Dir nicht komisch vor?
Klar kommt mir das komisch vor wollte ja auch das 2 Dimensionale Array direkt an Gdip_CreateBitmapFromScan0 übergeben nur Gdip_CreateBitmapFromScan0
erwartet ein zusammenhängendes Array wie soll ich das sonst machen als wie von Neutral General vorgeschlagen.

Das 2 Dimensionale zu einen eindimensionales konvertieren..
Das anschließend das 2 Dimensionale nicht mehr das widergibt was es eigentlich sollte ist mir auch klar.
Nur bitte schön wie ändern wenn es nicht erlaubt ist.

Danke für deine Ausführung.

Zitat:
Nirgends ist da ein Widerspruch oder Problem.
JO habe ich im nachhinein auch so verstanden du bist ja von Byte ausgegangen.

Zitat:
Ungeachtet dessen definierst Du SpectrumData2D als Array of Array of Byte. (Weil der Parameter Scan0 als PByte definiert ist).
Und auch das kommt Dir nicht komisch vor?
Nein kam mir nicht komisch vor aus dem Grund weil ich nicht immer hin und her konvertieren will wenn es nicht nötig ist.
Daher schien mir das als beste Lösung.

Zitat:
Es spricht ja auch nichts dagegen, SpectrumData2D auf Basis Bytes zu definieren, allerdings nicht nur 1 Byte je Pixel sondern 4 Bytes (= 1 UInt32).
Habe es als LongWord definiert und es kommen nun auch Daten.. ist also nicht mehr 0
Den Fehler warum es abgestürzt ist habe ich ebenfalls gefunden.

Trotz alledem will es nicht so wie es soll.

Zitat:
Selbstverständlich musst Du dann überall dort, wo Du auf SpectrumData2D zugreifst, Änderungen vornehmen.
Nun mit der Originalen Version von VB bekomme ich das nicht gebacken.
Range error, Überlauf Fehler usw..

Es stimmt definitiv noch nicht.
Die anderen hier die ich getestet habe führen zu keinen Werten trotz des neuen DatenTyp LongWord.
Habe das jetzt erstmal auf Seite gelegt. Source ist ja oben, wenn es jemand integrieren will muss er es selbst bewerkstelligen.
Ich für meinen Teil bekomme das nicht gebacken.

Es macht auch nur sinn wenn man das Projekt herunter lädt und es direkt damit testet
imaginär etwas in den Raum stellen bringt nicht viel weil es in dem fall nur Vermutungen sind und nicht wirklich weiterhelfen.. auch wenn es gut gemeint ist.

Mitunter ist die Praxis etwas anderes als die Theorie.

gruss

Geändert von EWeiss (30. Mär 2019 um 18:25 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:33 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