AGB  ·  Datenschutz  ·  Impressum  







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

RGB -> Bitmap

Ein Thema von Neutral General · begonnen am 8. Aug 2006 · letzter Beitrag vom 12. Aug 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: RGB -> Bitmap

  Alt 10. Aug 2006, 16:10
Les mal was ich geschrieben hab
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#12

Re: RGB -> Bitmap

  Alt 10. Aug 2006, 16:17
Zitat von Neutral General:
Les mal was ich geschrieben hab
d'oh, falsch gelesen...

Zitat von Neutral General:
Man kann das aber auch nur mit einem Stream machen oder ?
Ja, ich hab auch nur einen Stream (h) verwendet. Da ein Stream (in .NET) nur bytes (bzw. byte-arrays) schreiben kann, gibts da den BinaryWriter (s). Der MSDN-Library durchsuchenBinaryWriter ist kein Stream, sondern eine Klasse, die Daten in einen Stream schreibt.
In der Hoffnung, die Frage jetzt richtig verstanden zu haben

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: RGB -> Bitmap

  Alt 11. Aug 2006, 15:38
Delphi-Quellcode:
  
     SetLength(TGAInfo.Picture, TGAInfo.Header.Width, TGAInfo.Header.Height);
  if TGAInfo.Header.PictureFormat in [1..3] then
  begin
   for j:= 0 to TGAInfo.Header.Height-1 do begin
    for i:= 0 to TGAInfo.Header.Width-1 do begin
     AStream.Read(TGAInfo.Picture[i,j].B, SizeOf(Byte));
     AStream.Read(TGAInfo.Picture[i,j].G, SizeOf(Byte));
     AStream.Read(TGAInfo.Picture[i,j].R, SizeOf(Byte));
    end;
   end;

    BmpStream := WriteBmpHeader(TGAInfo.Header.Width,TGAInfo.Header.Height,TGAInfo.Header.Bpp);
    for j:= 0 to TGAInfo.Header.Height-1 do begin
     for i:= 0 to TGAInfo.Header.Width-1 do begin
      with BmpStream do
      begin
       Write(TGAInfo.Picture[i,j].B,SizeOf(Byte));
       Write(TGAInfo.Picture[i,j].G,SizeOf(Byte));
       Write(TGAInfo.Picture[i,j].R,SizeOf(Byte));
      end;
     end;
     for i:= 0 to (4 - (j * 3) mod 4) - 1 do
       BmpStream.Write(NULL,SizeOf(Byte));
    end;
    BmpStream.Read(FBitmap, BmpStream.Size);
// FBitmap.LoadFromStream(BmpStream); geht auch nicht
WriteBmpHeader:

Delphi-Quellcode:
function WriteBmpHeader(Width,Height: Longword; bpp: Word): TMemoryStream;
const Null : Longword = 0;
      Dat1 : Word = $4D42;
      Dat2 : Longword = $EC4;
var lwTemp: Longword;
    wTemp : Word;
begin
 Result := TMemoryStream.Create;
 with Result do
 begin
    Write(Dat1,SizeOf(Word));
    Write(NULL,SizeOf(Longword));
    Write(NULL,SizeOf(Longword));
    lwTemp := 54;
    Write(lwTemp,SizeOf(Longword));
    lwTemp := 40;
    Write(lwTemp,SizeOf(Longword));
    Write(Width,SizeOf(Longword));
    Write(Height,SizeOf(Longword));
    wTemp := 1;
    Write(wTemp, SizeOf(Word));
    Write(Bpp,SizeOf(Word));
    Write(NULL, SizeOf(Longword));
    Write(NULL, SizeOf(Longword));
    Write(Dat2,SizeOf(Longword));
    Write(Dat2, SizeOf(Longword));
    Write(NULL, SizeOf(Longword));
    Write(NULL, SizeOf(Longword));
 end;
end;
Es gibt zwar keine AV aber ich bekomme auch nichts zu sehen

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#14

Re: RGB -> Bitmap

  Alt 12. Aug 2006, 07:29
Ähm, vielleicht musst du die Komponente noch refreshen lassen?
Und warum machst du sizeof(byte) ? Nimm doch einfach "1"!

mfG

Markus

EDIT: Hä, das ist leicht verwirrend. Du nimmst dein TGAInfo, schreibst die Bilddaten rein, machst dir dann einen Bitmapheader im Bitmapstream, schreibst die Bilddaten von TGAInfo dort hinein und machst dann BMPStream.read(FBitmap,(BMPStream.size).
Da müsstest du FBitmap.loadfromstream(BMPStream) machen, der erste Befehl ist komplett sinnfrei.

Mein Vorschlag wäre, dass du die Daten aus deinem AStream immer in RGB-Päckchen als drei Bytes (mach dir nen Record!) lädst und dann in Umgekehrter Reihenfolge direkt in dein Bitmap schreibst.
Länge und Breite des Bildes musst du dann im Header festsetzen und bei deiner "Schreibschleife" entsprechend anstelle des TGAInfo verwenden. (Dieser Job schreit nach einem longword, da in den BMP-Specs auch ein Longword verwendet wird).
Markus
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#15

Re: RGB -> Bitmap

  Alt 12. Aug 2006, 11:05
Zitat von Neutral General:
Es gibt zwar keine AV aber ich bekomme auch nichts zu sehen
Ok, 2 Sachen sind mir beim aufgefallen:
  • Du schreibst NULL statt 0 in den Stream. Und wenn du dir die Definition von NULL ansiehst, es ist verschieden 0
  • Zitat von Neutral General:
    Delphi-Quellcode:
    //...
         for i:= 0 to (4 - (j * 3) mod 4) - 1 do
           BmpStream.Write(NULL,SizeOf(Byte));
        end;
        BmpStream.Read(FBitmap, BmpStream.Size);
    Ok, Du vergisst, dass am Ende die Groesse des Streams noch ans Offset 2 geschrieben werden muss. Bevor das Bitmap "Fertig" ist, brauchst du noch BmpStream.Position := 2; BmpStream.Write(BmpStream.Size, 4);
Ich weiss nicht genau, das FBitmap ist. Wenn es ein TBitmap ist, dann wird das sicherlich nicht funktionieren.
Das laden des Bitmaps sieht dann so aus:
Delphi-Quellcode:
BmpStream.Position := 0;
FBitmap := TBitmap.Create;
FBitmap.LoadFromStream(BmpStream);
greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#16

Re: RGB -> Bitmap

  Alt 12. Aug 2006, 11:28
@Neutral General: weißt die die Größe des Bitmaps welches in dem Strea mit "RGBRGBRGB..." steht?
Woher kommt der Stream. Wenn du die Größe weißt geht es so:
Delphi-Quellcode:
var lBitmap: TBitmap;
    lPtr : Pointer;
begin
  lBitmap := TBitmap.Create;
  lBitmap.Width := WidthOfTheStreamBmp;
  lBitmap.Height := HeightOfTheStreamBmp;
  lBitmap.PixelFormat := pf24bit;
  lPtr := lBitmap.ScanLine[lBitmap.Height - 1];
  DeinStream.Read(lPtr^, BytesOfBitmap);
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#17

Re: RGB -> Bitmap

  Alt 12. Aug 2006, 12:41


SirThornberry...
Das ist göttlich genial
Danke

EDIT: Sagen wir halb-göttlich
Das Bild steht aufm Kopf xD

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#18

Re: RGB -> Bitmap

  Alt 12. Aug 2006, 14:30
Das iss normal das das Bild auf dem Kopf steht, wenn man ScanLine[Bmp.Height-1] benutzt.

probiere es mal so hier:
Delphi-Quellcode:
var lBitmap: TBitmap;
    lPtr : Pointer;
    i : Integer;
begin
  lBitmap := TBitmap.Create;
  lBitmap.Width := WidthOfTheStreamBmp;
  lBitmap.Height := HeightOfTheStreamBmp;
  lBitmap.PixelFormat := pf24bit;
  for i:=0 to lBitmap.Height-1 do begin
    lPtr := lBitmap.ScanLine[i];
    DeinStream.Read(lPtr^, lBitmap.Width*3);
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#19

Re: RGB -> Bitmap

  Alt 12. Aug 2006, 14:34
Ja das hatte ich mir auch schon gedacht aber ich hatte irgendwie Angst es auszuprobieren bzw ich hatte befürchtet das das laden dann wieder so ewig lange dauert aber es funktioniert anscheinden doch

thx an alle

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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