![]() |
18bit Bilder erstellen??
Hallo, gibt es irgendeine klasse oder eine funktion mit der ich ein normales bitmap in ein BIld mit 18bit farbtiefe (ich weiß, ziemlich ungewohntes format) umwandeln kann? Danke im vorraus!!
|
Re: 18bit Bilder erstellen??
Nein, eine fertige Klasse oder ähnliches wirst du nicht finden. Also vielleicht mit google suchen oder so, aber auch da denke ich nicht, dass du fündig wirst, zu ungewöhnlich.
Die Standardklasse in Delphi zum Anzeigen von Bitmaps unterstützt dieses Format definitiv nicht. Müsstest du dir halt evtl. eine eigene Klasse bauen. Ist eigentlich nicht weiter schwer (musste ich auch schon für 16-Bit Graustufen Tiffs machen). Gruß Der Unwissende |
Re: 18bit Bilder erstellen??
Hallo!
erstmal: willkommen in der Delphi-PRAXiS! :party: zu deiner Frage: Standardmäßig bei Delphi mitgeliefert wird da nichts... Aber existiert dieses Format denn überhaupt :?: 18 Bit wären je 64 Farben für Rot, Grün und Blau... für was brauchst du das denn überhaupt? ein 24bit-Bitmap darin zu speichern macht keinen Sinn, da dabei Qualität verloren geht und bei einem 16-bit-Bitmap weil es mehr Speicherplatz benötigt... um ein Bild platzsparend zu speichern kannst du auch jpegs verwenden...
Delphi-Quellcode:
uses
[...], jpeg; [...] var j:tjpegimage; b:tbitmap; begin //jetzt ist ein Bild im Bitmap j:=tjpegimage.create; j.compressionquality:=100; //verlustfreie Kompression j.assign(b); j.savetofile(filename); end; |
Re: 18bit Bilder erstellen??
Hi, danke schonmal für die Antworten. Nein, ich brauche ein 18bit bitmap, da dieses in meiner Handyfirmware verwendet wird (ich baue ein Programm um bilder darin zu tauschen) ich kenne auch nur ein einziges Programm das diese bilder bearbeiten kann, und das ist resman, ein program auch für samsung firmwares, aber keine ahnung wie die das gemacht haben... sowas zu programmieren scheidet bei mir definitiv aus, ich kenne mich zwar mit delphi etc recht gut aus, aber von bildern etc verstehe ich recht wenig....
|
Re: 18bit Bilder erstellen??
Liste der Anhänge anzeigen (Anzahl: 1)
es gibt webseiten, auf denen ist die Struktur der Formate gespeichert. :kotz: welche Firma schreibt denn dermaßen inkompatible Firmwares?
Hier die Seite: ![]() die haben folgende Beschreibung für Bitmaps: |
Re: 18bit Bilder erstellen??
tja, samsung tut das leider. ich glaube die machen das extra...
Naja, mit der txt datei kann ich wenig anfangen, da steht auch nix von 18bit und das selbst zu programmieren, wie gesagt, da hörts bei mir leider auf :? |
Re: 18bit Bilder erstellen??
Woher weißt du denn genau, dass es sich um 18 Bit Bitmaps handelt?
Wenn es sich um ein properitäres Format handelt, kann natürlich auch einfach eine Palette benutzt werden, die 18 Bit groß ist, ein Packverfahren oder halt (wie z.B. bei Tiff) ein Containerformat, so dass auch andere Mögliche Bitraten erlaubt wären. Falls es eine Spezifikation gibt, ist es eigentlich weniger problematisch das selbst zu Programmieren. Eigentlich besteht der Trick darin, dass du alle Farbwerte (per Dreisatz) umrechnest. Wenn du also 6 Bit pro Kanal hast, dann kannst du jedes Standard 24Bit Bild einfach umrechnen. Aber ohne Spezifikation gilt es natürlich den Header zu entschlüsseln. Gruß Der Unwissende |
Re: 18bit Bilder erstellen??
eine Platte mit 18 Bit?
size = 2^18 x 3 Byte = 786432 Byte = 0,77 MB... :gruebel: |
Re: 18bit Bilder erstellen??
Hier
![]() Vielleicht findest du auch hier was brauchbares: ![]() Gruß Pfoto |
Re: 18bit Bilder erstellen??
Zitat:
![]() |
Re: 18bit Bilder erstellen??
Liste der Anhänge anzeigen (Anzahl: 1)
Hm, also da steht wirklich was von 18bit bildern, aber irgendwie auch nicht wirklich...
Ja, ich weiß ganz sicher das ich 18bit bilder brauche... Hier mal ein Bild aus der Firmware, das ist so ein 18bit bild, ich weiß nicht ob ihr damit was anfangen könnt?!? Also es ist 116160Bytes groß und 176x220px. |
Re: 18bit Bilder erstellen??
Zitat:
Test-Code könnte so aussehen:
Delphi-Quellcode:
function Bitmap18ToHandle(Source: Pointer; Width, Heigth: Integer): HBITMAP;
type PPixel18 = ^TPixel18; TPixel18 = record Data: array [0..2] of Byte; // Three bytes? end; var DevContext: HDC; BitmapInfo: TBitmapInfo; BitmapBits: PRGBTriple; x, y: Integer; SourceBits: PPixel18; begin Result := 0; DevContext := CreateCompatibleDC(0); if DevContext = 0 then Exit; try ZeroMemory(@BitmapInfo, SizeOf(TBitmapInfo)); with BitmapInfo.bmiHeader do begin biSize := SizeOf(TBitmapInfoHeader); biWidth := Width; biHeight := -Heigth; // top-down biPlanes := 1; biBitCount := 24; biCompression := BI_RGB; end; Result := CreateDIBSection(0, BitmapInfo, DIB_RGB_COLORS, Pointer(BitmapBits), 0, 0); if Result = 0 then Exit; try SourceBits := Source; for y := 1 to Heigth do begin for x := 1 to Width do begin //FIXME: Pixel conversion...? // ______bb bbbbgggg ggrrrrrr // rrrrrrrr gggggggg bbbbbbbb BitmapBits.rgbtRed := ((SourceBits.Data[0] and $3F) ); BitmapBits.rgbtGreen := ((SourceBits.Data[0] ) shr 6) or ((SourceBits.Data[1] and $0F) shl 2); BitmapBits.rgbtBlue := ((SourceBits.Data[1] ) shr 4) or ((SourceBits.Data[2] and $03) shl 4); Inc(BitmapBits); Inc(SourceBits); end; // Scanline alignment on DWORD boundaries BitmapBits := Pointer((Cardinal(BitmapBits) + 3) and Cardinal(not 3)); end; except DeleteObject(Result); Result := 0; end; finally DeleteDC(DevContext); end; end; procedure TForm1.Button1Click(Sender: TObject); var Stream: TMemoryStream; begin Stream := TMemoryStream.Create(); try Stream.LoadFromFile('pwroff04.ani'); Image1.Picture.Bitmap.Handle := Bitmap18ToHandle(Stream.Memory, 176, 220); finally Stream.Free(); end; end; |
Re: 18bit Bilder erstellen??
Hey, danke, wir kommen der Sache ja schon näher!!
Nur leider bekomme ich ein komplett schwarzes Bild wenn ich deinen code benutze!! |
Re: 18bit Bilder erstellen??
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
wie soll denn dein Originalbild aussehen? Hab hier ein Samsung-bla, irgendwas mit Feuerwehr und das ganze mit einem gelben Hintergrund, aber mich würde das eigentliche original interessieren. Gruß Der Unwissende |
Re: 18bit Bilder erstellen??
Hast du eigentlich irgendwie die Beschreibung aus der du das mit den 18 Bit hast?
|
Re: 18bit Bilder erstellen??
Liste der Anhänge anzeigen (Anzahl: 1)
das Bild was du angehängt hast ist bei mir auch schwarz?!?!!!
Ja, das ist genau richtig, ich hänge dir mal das bild was ich eben geschickt hab als 24bit bitmap an, aber das was du gesagt hast stimmt schonmal! Ja, also das ist GANZ sicher 18bit, so ist das Bild in Resman, dem schon existierenden programm für samsung-firmwares beschrieben: <img ofs="0x00d98e58" title="0x00d98e58" width="176" height="220" bpp="18"> und im programm steht auch immer wieder 18bit |
Re: 18bit Bilder erstellen??
wenn ich bei deinem bild den kontast ganbz hoch drehe bekomme ich ein spiegelverkehrtes, auf dem kopf stehendes bild wo der hintergrund türkis ist und alle anderen farben auch nicht stimmen?!?
|
Re: 18bit Bilder erstellen??
Zitat:
Das erinnert mich an Anrufe bei der PC-Hotline, wo felsenfest behauptet wird, der PC sei kaputt, und wo sich dann irgendwann rausstellt, dass er nur nicht ans Stromnetz angeschlossen war... |
Re: 18bit Bilder erstellen??
hm, also bein bildschirm ist wirklich etwas dunkel, aber das bild ist pechschwarz bei mir... naja,un d halt das die farben falsch sind , es auf dem koüf steht und seitenverkehrt ist, aber sonst kommen wir der Sachen schon sehr sehr nahe!! ich brauch das bild jetzt nur noch richtig, wo ist denn der fehler?!?
|
Re: 18bit Bilder erstellen??
Ja, wo der Fehler ist, ist jetzt die Interessante Frage. Muss wohl nochmal genauer schauen, was man mit den 18 Bit anstellen muss, um es richtig hinzubekommen. Dass mit dem Spiegelverkehrt liegt eigentlich nur an der Logik, wie man die Bits anordnet. Selbes gilt grob für die Farben, kannst halt RGB, RBG, BRG, ... Anordnen. Aber selbst mit Farbtauschen komm ich nicht wirklich auf das erwartete Bild. Es gibt natürlich auch Bilder, die ihre Farben in RRRRRRRRRR....GGGGGGGGGG.....BBBBBBBB.... oder so anordnen. Und es gibt natürlich noch feste Farbpaletten, wobei du dann nur einen Index auf einen Eintrag hast. Und ohne die Tabelle der Farben kannst du dann nichts machen. Die sind in dem File definitiv nicht vorhanden.
Hab nicht mehr gemacht als einen Standard-Bitmap header an diese Daten anzufügen. Na ja, hab die Farbinfos auch noch einmal 2 Bit geschifftet (macht die Farben aber nur dunkler, logischer Weise, nicht richtiger). Werde mal nochmal schauen, wenn ich Zeit hab, Gruß Der Unwissende |
Re: 18bit Bilder erstellen??
hey, schonmal echt danke für deine Hilfe, wäre echt verdammt cool wenn du das noch irgendwie hinbekommen würdest. leider kann ich kaum helfen, von der function die du geschickt hast verstehe ich nur banhof. meinst du denn das das irgendwie geht??Sag bescheid wenn doch noch mehr bilder oder infos oder sowas brauchst!
Gruß und danke SIMON |
Re: 18bit Bilder erstellen??
schon mal versucht die Pixel und 2 bit nach links zu verschieben. Und das Bild verkehrt herum zu lesen?
Die Scheinen es genauso zu machen, wie es zu den alten Dos mit Bildern gearbeitet wurde. Damals gab es auch nur 6 Bit pro Farbe. EDIT: Das ist es erstmal nicht. Für Weis wird nur $FFFF, und irgentwie hab ich noch nicht raus für was das 3 byte da ist. Wahrscheinlich wird byte 1 und 2 und die 2 höchstens Bits von byte 3 verwendet. |
Re: 18bit Bilder erstellen??
Liste der Anhänge anzeigen (Anzahl: 1)
Nach Umschreiben des Testprogrammes und mehrstündiger Analyse :coder2: der Hex-Darstellung :freak: im Vergleich zum Original bin ich zum Entschluss gekommen, dass diese Codierung vorliegt :dancer: :
Code:
Die Unterstriche stellen nullen dar.
32 5432 7654 7654 3276
bb__ ____ gggg bbbb rrrr rrgg Angehängt ist der Quick&Dirty Algorithmus. Muss unbedingt Optimiert werden. EDIT: Manchmal liegt er um eins oder zwei Farbwerte daneben, die scheinen sich was anderes für die Farbanpassung ausgedacht zu haben. Sehen wird man das aber mit dem blosen Auge nicht :mrgreen: . Das war mal wieder eine Interessante Frage! THX |
Re: 18bit Bilder erstellen??
wow leute, ihr seid echt gut hier, soeine Hilfe hab ich ja in keinem Forum bisher bekommen!!:thumb: :thumb:
Hmm, den Code optimieren, das sagst du so, ich verstehe keine Zeile davon, aber ich werd alles mal nachschlagen und Probieren es zu verstehen, vlt kann ich ja dann was Optimieren... Eine Frage, ich weiß ihr habt schon echt viel Zeit investiert, danke, aber ich brauch das auch noch anders rum! Also ich brauche eine Function die von 24bit bmp in dieses Bild umwandelt, und eine die zurück wandelt!!! |
Re: 18bit Bilder erstellen??
Wenn du verstanden hast wie ich die eine Einrichtung erstellt habe. Kommst du auch auf den Weg für die andere.
Falls es Verständnis-Probleme gibt, stell am besten eine direkte Frage. Bitte nix allgemeines! |
Re: 18bit Bilder erstellen??
ich habe gerad kein delphi hier (erst heut abend wieder), probiere das gerade anhand des quellcodes zu verstehen... Wofür ist denn die Mouseover Procedure beim Image1? Wofür ist das Label und wofür das image2?!?
Naja, ich versteh das, das mit keinen allgemeinen Fragen, aber du stellst mich vor eine unlösbare Aufgabe, ich hab noch nie mit bitmaps oder den functionen dafür gearbeitet, ich würde das nie hinkriegen das andersrum zu machen... |
Re: 18bit Bilder erstellen??
Vielleicht bin ich morgen wieder wach (in ca 9h) genug um mal ein paar Sätze zu schreiben. Was du da alles aufgezählt hast, hat nichts direkt mit dem Bitmap zu tun.
Im Prinzip sind Bitmaps die simpelste Darstellung eines Bildes. Sie sind nur ein 2D-Array mit Pixeln. Und im Prinzip interessiert dich eigentlich primär nur die Funktion Bitmap18ToHandle. Ich geb zu um die Geschichte andersherum zu gestalten muss, man sich auch mal mit der GDI beschäftigen oder die TBitmap-Klasse von Delphi verstehen. Wo ich letzteres Vorziehen würde. Btw. Wenn ich nicht vergesse und Zeit habe kann ich die Funktion eve. etwas freundlicher Gestalten. Vielleicht findet sich auch jemand anderer in der Zwischenzeit. |
Re: 18bit Bilder erstellen??
hi, bitte vergiss mich nicht :wink:
ist es denn echt sehr Zeitaufwändig noch eine function zu bauen die es genau andersrum macht? Die code optimierung bekomme ich schon hin, ich probiere so lange rum bis es passt, aber die 2. Function, das kann ich nicht! ich schau heut abend nochmal rein, danke erstmal an alle die helfen! |
Re: 18bit Bilder erstellen??
Liste der Anhänge anzeigen (Anzahl: 1)
So, das war aber jetzt wirklich der letzte Akt für heute.
Enthalten sind zwei Funktionen für das Konvertieren. Vergiss den Autor nicht ;) Versuch mal im Internet etwas über Bitmaps und deren Aufbau in Erfahrung zu bringen. Oder stell direkte Fragen. Gute Nacht! |
Re: 18bit Bilder erstellen??
DANKE!! Ich weiß garnicht was ich sagen soll, echt danke.
2 verständnissfragen hab ich: der pointer bei der Bmp24ToBmp18 function, wir der nur zum freemem gebraucht? Und: In wieweit wird denn da zeigerverkettet gearbeitet, dieses ^ ist doch das zeichen für ein zeiger, oder? |
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:
Bitmap 24-Bit:
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]
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] |
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 |
Re: 18bit Bilder erstellen??
Zitat:
Zitat:
|
Re: 18bit Bilder erstellen??
Zitat:
|
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:
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??
stmData := TMemoryStream.Create;
stmData.LoadFromFile('pwroff04.ani'); bmp := Bmp18ToBmp24(stmData.Memory^, 176, 220); 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? |
Re: 18bit Bilder erstellen??
Also ich habe mir diese Function gebaut um ein BIld aus der Firmware zu holen:
Delphi-Quellcode:
und hier meine Bildtauschen function... Nur leider auch hier kein ergebniss... ICh komme einfach mit deinen functions nicht klar
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;
Delphi-Quellcode:
nur leider geht da garnichts!
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; |
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:
Delphi-Quellcode:
Gruß Der Unwissende
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; |
Re: 18bit Bilder erstellen??
Bitte ergänzen bzw. änderen.
Delphi-Quellcode:
var -> const getauscht, schreib ja eh nicht in die daten
//
// 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;
Delphi-Quellcode:
var -> out, da ich nur etwas zurückgebe
//
// 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; Fix:
Delphi-Quellcode:
Füge mal bitte diese Zeile ein nach dem Begin von Bmp24ToBmp18. Das sollte lästige Warnungen vermeiden.
Result := 0;
|
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? |
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 19:40 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