Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 18bit Bilder erstellen?? (https://www.delphipraxis.net/57079-18bit-bilder-erstellen.html)

NicoDE 17. Nov 2005 10:40

Re: 18bit Bilder erstellen??
 
Im Prizip ist dein '18-Bit'-Bild ein '24-Bit'-Bild bei dem nur 18-Bit für die Farbwerte benutzt werden (und in ungewöhnlicher Anordnung gespeichert werden). Es geht eigentlich nur darum die Pixel zwischen den beiden Formaten zu konvertieren:

Samsung '18-Bit' (frech von neolithos kopiert ;)):
Code:
P-Bit: [color=grey]2222 1111  1111 1100  0000 0000[/color]
P-Bit: [color=grey]3210 9876  5432 1098  7654 3210[/color]
Color: [color=blue]bb[/color]aa aaaa [color=green]gggg[/color] [color=blue]bbbb[/color] [color=red]rrrr rr[/color][color=green]gg[/color]
C-Bit: [color=grey]32?? ????  5432 7654  7654 3276[/color]
Bitmap 24-Bit:
Code:
P-Bit: [color=grey]2222 1111  1111 1100  0000 0000[/color]
P-Bit: [color=grey]3210 9876  5432 1098  7654 3210[/color]
Color: [color=red]rrrr rrrr[/color] [color=green]gggg gggg[/color] [color=blue]bbbb bbbb[/color]
C-Bit: [color=grey]7654 3210  7654 3210  7654 3210[/color]

Simon6785 17. Nov 2005 11:06

Re: 18bit Bilder erstellen??
 
ja, das bringt mich im verständniss schon weiter...

ja, samsung macht das extra um es moddern zu schwer wie möglich zu machen. deshalb machen die solche Formate

neolithos 17. Nov 2005 20:45

Re: 18bit Bilder erstellen??
 
Zitat:

Zitat von Simon6785
der pointer bei der Bmp24ToBmp18 function, wir der nur zum freemem gebraucht?

Ja, sicherlich da ich in der Funktion mittels GetMem den speicher reserviere.

Zitat:

Zitat von Simon6785
Und: In wieweit wird denn da zeigerverkettet gearbeitet, dieses ^ ist doch das zeichen für ein zeiger, oder?

Du meinst sicherlich das Inc(PByte(pCur), 3). Was bedeutet das ich den Zeiger von pCur auf das nächste Pixelchen setze.

neolithos 17. Nov 2005 20:50

Re: 18bit Bilder erstellen??
 
Zitat:

Zitat von NicoDE
Samsung '18-Bit' (frech von neolithos kopiert ;)):

Gut das da der Smilie ist! Aber hätte man das auch irgentwo auch finden können, hab bald ne 3/4h mit suchen verbracht.

Simon6785 17. Nov 2005 20:56

Re: 18bit Bilder erstellen??
 
ich krichts nicht hin :cry:

tut mir ja echt leid, aber ich schaffs nicht. also, du rufst so die function auf

Delphi-Quellcode:
stmData := TMemoryStream.Create;
  stmData.LoadFromFile('pwroff04.ani');

  bmp := Bmp18ToBmp24(stmData.Memory^, 176, 220);
jetzt hab ich aber das 18bit bild nicht in nem filestream sondern in nem bytearray! Was kann ich ja vlt noch in integer kriegen mit ner schleife, aber wie gehts dann weiter??

du arbeitest da doch irgendwie mit zeigern oder so, n var davor, die werte gehen nach funktionsaufruf wieder in den zeiger zurück etc, ich bin da gerad etwas überfordert. ich möchte der function einfach n integer geben mit den ganzen bytes und er gibt mir n bitmap zurück, oder tut er das schon?!?! ich komme überhaupt nicht klar mit den ganzen zeigern etc gerade. bei der 24in18 procedure ist der rückgabewert doch cardinal. cardinal kann aber doch niemals das ganze 18bit bild enthalten, dafür ist er doch viel zu klein?!!? Was an dem ganzern kapier ich gerad nicht?

Simon6785 18. Nov 2005 07:52

Re: 18bit Bilder erstellen??
 
Also ich habe mir diese Function gebaut um ein BIld aus der Firmware zu holen:

Delphi-Quellcode:
function TForm1.bmpausfirmware(offset,groesse:integer):TBitmap;
VAR i:integer; buf: array of byte; ergebniss:string;
begin
cla := TFileStream.Create(pfad, fmOpenread);
cla.Position:=offset;
SetLength(buf, groesse);
cla.Read(buf[0], groesse);
ergebniss:='';
for i:=0 to groesse do
 ergebniss:=ergebniss + inttostr(buf[0]);
 i:=strtoint(ergebniss);
result:=Bmp18ToBmp24(i,176,220);
 end;
und hier meine Bildtauschen function... Nur leider auch hier kein ergebniss... ICh komme einfach mit deinen functions nicht klar

Delphi-Quellcode:
procedure TForm1.bildtauschen(offset:integer;groese:integer);
VAR bild:integer;
p : Pointer;
begin
bild:=Bmp24ToBmp18(image2.picture.bitmap,p);
cla := TFileStream.Create(pfad, fmOpenread);
cla.Position:=offset;
cla.write(bild,groese);
FreeAndNil(cla);
FreeMem(p);
end;
nur leider geht da garnichts!

Der_Unwissende 18. Nov 2005 08:20

Re: 18bit Bilder erstellen??
 
Hi,
ich glaub du hast die Bmp24ToBmp18-Funktion noch nicht richtig verstanden.
Du übergibst der Methode eine 24-Bit Bitmap und einen Pointer (der dann auf dein erzeugtes ByteArray zeigt) und da es nur ein Pointer ist, weißt du nicht wie groß die zurückgegebene Struktur ist. (Ok, liegt er daran dass sie mit GetMem oder so angelegt wird). Jedenfalls ist dein Rückgabewert die Größe dessen, was du bekommst.

Zitat:

Zitat von Simon6785
Also ich habe mir diese Function gebaut um ein BIld aus der Firmware zu holen:
Delphi-Quellcode:
procedure TForm1.bildtauschen(offset:integer;groese:integer);
VAR bild:integer;
p : Pointer;
begin
bild:=Bmp24ToBmp18(image2.picture.bitmap,p);
cla := TFileStream.Create(pfad, fmOpenread);
cla.Position:=offset;
cla.write(bild,groese);
FreeAndNil(cla);
FreeMem(p);
end;

muss zu (oh, du solltest die Datei zum Schreiben öffnen, nicht zum lesen)

Delphi-Quellcode:
procedure TForm1.bildtauschen(offset : Integer);
VAR length : integer;
    p : Pointer;
begin
  length := Bmp24ToBmp18(image2.picture.bitmap,p);
  cla := TFileStream.Create(pfad, fmOpenWrite or fmShareExclusive);
  cla.Position := offset;
  cla.write(p, length); // hier bin ich mir nicht ganz sicher ob das so funktioniert
  // Alternativ
  // cla.write(TByteArray(p)[0], length); // mit TByteArray = Array of Byte
  FreeAndNil(cla);
  FreeMem(p);
end;
Gruß Der Unwissende

neolithos 18. Nov 2005 08:32

Re: 18bit Bilder erstellen??
 
Bitte ergänzen bzw. änderen.
Delphi-Quellcode:
//
// Wandelt das 18 Bit Bild in ein 24 Bit Bild um.
//
//  data   - Daten des 18 bit Bildes
//  iWidth - Breite des Bildes
//  iHeight - Höhe des Bildes
//  Result - Ein neu erzeugtes TBitmap-Object mit den 24 Bit Bild
//
function Bmp18ToBmp24(const data; iWidth, iHeight: Integer): TBitmap;
var -> const getauscht, schreib ja eh nicht in die daten

Delphi-Quellcode:
//
// Wandelt ein 24 Bit Bild in ein 18 Bit Bild um.
//
//  bmp   - Bitmap, welches umgewandelt wird. Diese Bild wird nicht geändert
//           sondern intern in ein neues Bitmap kopiert.
//  pDest - Rückgabe des via GetMem erzeugten Speicherbereiches der die Daten
//           des 18 Bit Bitmaps enthält.
//  Result - Größe des zurückgegebenen Speicherbereiches
//
function Bmp24ToBmp18(bmp : TBitmap; out pDest : Pointer) : Cardinal;
var -> out, da ich nur etwas zurückgebe

Fix:

Delphi-Quellcode:
  Result := 0;
Füge mal bitte diese Zeile ein nach dem Begin von Bmp24ToBmp18. Das sollte lästige Warnungen vermeiden.

Simon6785 18. Nov 2005 08:35

Re: 18bit Bilder erstellen??
 
ahja, es wird mir immer klarer!!

Ich hab mich schon die ganze zeit gefragt wofür der Zeiger ist und wie so ein ganzes Bild in eine Cardinal variable passen soll :wink:

Ja, das sollte Funktionieren!!

Und was ist mit der Bildausfirmware? Eigentlich doch völlig korrekt, oder sehe ich das falsch? Funzt aber nicht

Ach, noch eins, du schreibst const data; von welchem datentyp ist denn data? Integer?

neolithos 18. Nov 2005 08:37

Re: 18bit Bilder erstellen??
 
Fast richtig:

Delphi-Quellcode:
procedure TForm1.bildtauschen(offset : Integer);
VAR length : integer;
    p : Pointer;
begin
  length := Bmp24ToBmp18(image2.picture.bitmap, p);
  cla := TFileStream.Create(pfad, fmOpenWrite or fmShareExclusive);
  cla.Position := offset;
  cla.write(p^, length);
  FreeAndNil(cla);
  FreeMem(p);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 Uhr.
Seite 4 von 6   « Erste     234 56      

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