AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia 15Bit RGB in TBitmap32 konvertieren
Thema durchsuchen
Ansicht
Themen-Optionen

15Bit RGB in TBitmap32 konvertieren

Ein Thema von SittingDuck · begonnen am 7. Mai 2011 · letzter Beitrag vom 8. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
SittingDuck

Registriert seit: 11. Jan 2006
Ort: Leverkusen
159 Beiträge
 
Delphi 2010 Professional
 
#1

15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 13:11
Moin zusammen ...

Ich versuche 16Bit RGB(555) Raw-Daten in ein TBitmap32 zu bekommen, aber irgendwas stimmt hier nicht ... Bit-Schieben ist nicht so meine Stärke. Wer kann helfen? Dieses Format wird hier ganz gut beschrieben.

Delphi-Quellcode:
 

var i: Integer; Ptr: Pointer; RawMS: TMemoryStream;

  RawMS.CopyFrom(SourceMS, 50560); // RawDaten holen (158 * 158 * 2)
   
  bmp := TBitmap.Create;
  TempMap := TBitmap32.Create;

  bmp.Width := 158; bmp.Height := 158;
  bmp.PixelFormat := pf15bit; // so stimmen zumindestens die Farben

  for i := 0 to 157 do begin
    Ptr := bmp.ScanLine[i];
    RawMS.Read(Ptr^, bmp.Width * 2);
  end;

  TempMap.Assign(bmp);
  TempMap.DrawTo(FotosImage.Bitmap, 4, 4); // Ausgeben auf einem TImageView32
Das Ergebnis ist irgendwie verschoben. (siehe Bild im Anhang ... soll ein grinsender Smiley sein)
Auch gefällt mir der Umweg über das TBitmap nicht. Kann man das nicht direkt in ein TBitmap32 einlesen?
Miniaturansicht angehängter Grafiken
smiley.png  
Ciao ... SittingDuck
iPhone Backup und mehr: iTwin v3.9 Beta ... Alternative Startleiste: Launcher v3.8 !

Geändert von SittingDuck ( 7. Mai 2011 um 13:23 Uhr) Grund: Format-Beschreibung hinzugefügt
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 14:31
TBitmap32 müsste doch eine setpixel Methode oder so haben.
Dann einfach immer 2 byte aus dem Stream lesen, umwandeln und die Farbe zuweisen.
Das umwandeln kannst du gut in eine kleine Funktion auslagern die die Bits shiftet und einen TColor32 zurückgibt.
Ungefähr so:
Delphi-Quellcode:
function Convert15bitToColor32(x: Word): TColor32;
begin
  Result.B := (x or $1F) shl 3;
  Result.G := (x or $3E0) shr 2;
  Result.R := (x or $7C00) shr 7;
end;
  Mit Zitat antworten Zitat
SittingDuck

Registriert seit: 11. Jan 2006
Ort: Leverkusen
159 Beiträge
 
Delphi 2010 Professional
 
#3

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 16:21
Super Idee ... Danke schonmal für Deine Hilfe. Trotzdem, irgenwas mache ich noch falsch.
Delphi-Quellcode:
var i: Integer; Buf: Word; col32: TColor32; RawMS: TMemoryStream;

begin
  RawMS.CopyFrom(SourceMS, 50560); // RawDaten holen (158 * 158 * 2)
   
  TempMap := TBitmap32.Create; TempMap.SetSize(158, 158);

  for j := 0 to 157 do
    for i := 0 to 157 do begin
      RawMS.ReadBuffer(Buf, 2);
      
      TColor32Entry(col32).A := 255;
      TColor32Entry(col32).R := Byte(Buf or $7C00);
      TColor32Entry(col32).G := Byte(Buf or $3E0 );
      TColor32Entry(col32).B := Byte(Buf or $1F );
      
      TempMap.SetPixelT(i, j, col32);
    end;
  end;
  
  TempMap.DrawTo(FotosImage.Bitmap, 4, 4); // Ausgabe auf einem TImageView32
end;
Das Bitmap ist danach einfach nur weiss ...
Ciao ... SittingDuck
iPhone Backup und mehr: iTwin v3.9 Beta ... Alternative Startleiste: Launcher v3.8 !

Geändert von SittingDuck ( 7. Mai 2011 um 16:22 Uhr) Grund: Ergebnis fehlte ...
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 16:26
Du musst schon bitshiften...
  Mit Zitat antworten Zitat
SittingDuck

Registriert seit: 11. Jan 2006
Ort: Leverkusen
159 Beiträge
 
Delphi 2010 Professional
 
#5

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 16:38
Stimmt, habe ich vergessen hinzuschreiben ... (Copy/Paste-Fehler von mir)
Delphi-Quellcode:
    TColor32Entry(col32).A := 255;
    TColor32Entry(col32).R := Byte(Buf or $7C00) shr 7;
    TColor32Entry(col32).G := Byte(Buf or $3E0 ) shr 2;
    TColor32Entry(col32).B := Byte(Buf or $1F ) shl 3;
So hatte ich es auch gemacht ... der Effekt (weißes Bild) bleibt aber.
Ciao ... SittingDuck
iPhone Backup und mehr: iTwin v3.9 Beta ... Alternative Startleiste: Launcher v3.8 !
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 16:43
Auf den zweiten Blick: Müsste es nicht AND sein statt OR?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 17:01
Auf den zweiten Blick: Müsste es nicht AND sein statt OR?
Ja, müsste es. Tut mir Leid ^^
  Mit Zitat antworten Zitat
SittingDuck

Registriert seit: 11. Jan 2006
Ort: Leverkusen
159 Beiträge
 
Delphi 2010 Professional
 
#8

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 20:33
Ja, das wars ... Danke für Eure Hilfe. Hier nochmal die bereinigte Routine, falls ein anderer mal vor einem ähnlichen Problem steht.
Delphi-Quellcode:
var i: Integer; b: Word; TempMap: TBitmap32; ms: TMemoryStream; P: PColor32;
begin
  ms := TMemoryStream.Create; ms.LoadFromFile('Pic.raw'); ms.Position := 0;
  
  with TempMap do begin SetSize(150, 150); P := PixelPtr[0, 0];
   
    for i := 0 to Width * Height - 1 do begin ms.ReadBuffer(b, 2);
      P^ := Color32(b and $7C00 shr 7, b and $3E0 shr 2, b and $1F shl 3);
      Inc(P);
    end;

    DrawTo(FotosImage.Bitmap, 4, 4, Rect(0, 0, 150, 150));
  end;
end;
Dies dürfte wohl auch die schnellste Lösung sein. Im Anhang das korrigierte Bild.
Miniaturansicht angehängter Grafiken
smileyok.png  
Ciao ... SittingDuck
iPhone Backup und mehr: iTwin v3.9 Beta ... Alternative Startleiste: Launcher v3.8 !
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 7. Mai 2011, 20:51
Dies dürfte wohl auch die schnellste Lösung sein. Im Anhang das korrigierte Bild.
Will zwar nicht kleinlich sein, aber wenn du die Funktion Color32() als Inline deklarierst, sparst du einen Call Befehl und somit dürfte das dann um einen Tick schneller sein
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#10

AW: 15Bit RGB in TBitmap32 konvertieren

  Alt 8. Mai 2011, 07:59
Delphi-Quellcode:
procedure Load15BitPicFromRawFile(Filename: String; W, H: integer;
  DestBitmap32: TBitmap32; PosX, PosY: integer);
var
  i: Integer;
  b: Word;
  P: PColor32;
begin
  with TMemoryStream.Create do
  try
    LoadFromFile(Filename);
    Position := 0;

    with TBitmap32.Create do
    try
      SetSize(W, H);
      P := PixelPtr[0, 0];

      for i := 0 to Width * Height - 1 do
      begin
        ReadBuffer(b, 2);
        P^ := $FF000000 or (b and $7C00 shr 7) or (b and $3E0 shr 2) or (b and $1F shl 3);
        Inc(P);
      end;

      DrawTo(DestBitmap32, PosX, PosY);
    finally
      Free;
    end;
  finally
    Free;
  end;
end;
Oder so ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser

Geändert von turboPASCAL ( 8. Mai 2011 um 08:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:28 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