Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

Simon6785 15. Nov 2005 14:59


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!!

Der_Unwissende 15. Nov 2005 15:43

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

ichbins 15. Nov 2005 15:48

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;

Simon6785 15. Nov 2005 16:13

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....

ichbins 15. Nov 2005 16:24

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: Wotsit.org

die haben folgende Beschreibung für Bitmaps:

Simon6785 15. Nov 2005 16:49

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

Der_Unwissende 15. Nov 2005 18:53

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

ichbins 15. Nov 2005 18:56

Re: 18bit Bilder erstellen??
 
eine Platte mit 18 Bit?

size = 2^18 x 3 Byte = 786432 Byte = 0,77 MB... :gruebel:

Pfoto 15. Nov 2005 19:15

Re: 18bit Bilder erstellen??
 
Hier http://www.brackeen.com/home/vga/bitmaps.html wird beschrieben, wie man aus 24-bit 18-bit macht (glaub ich zumindest, hab's nur kurz überflogen) -- und ist auch nur in C geschrieben.

Vielleicht findest du auch hier was brauchbares:
http://www.efg2.com/Lab/index.html


Gruß
Pfoto

Sharky 15. Nov 2005 19:22

Re: 18bit Bilder erstellen??
 
Zitat:

Zitat von Simon6785
tja, samsung tut das leider....

Anscheinend nicht nur Samsung. Auch NEC hat da etwas in der Produktpaltette: NL8060BC31-27 Der hat auch eine 6Bit RGB ansteuerung.

Simon6785 16. Nov 2005 16:10

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.

NicoDE 16. Nov 2005 17:34

Re: 18bit Bilder erstellen??
 
Zitat:

Zitat von Simon6785
Also es ist 116160Bytes groß und 176x220px.

Das wären genau 3 Byte pro Pixel (kein Header).
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;

Simon6785 16. Nov 2005 17:59

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!!

Der_Unwissende 16. Nov 2005 18:05

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

Der_Unwissende 16. Nov 2005 18:06

Re: 18bit Bilder erstellen??
 
Hast du eigentlich irgendwie die Beschreibung aus der du das mit den 18 Bit hast?

Simon6785 16. Nov 2005 18:34

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

Simon6785 16. Nov 2005 18:37

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?!?

ultrasombrero 16. Nov 2005 20:08

Re: 18bit Bilder erstellen??
 
Zitat:

Zitat von Simon6785
das Bild was du angehängt hast ist bei mir auch schwarz?!?!!!

Lol. Wie dunkel ist dein Bildschirm denn eingestellt???

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...

Simon6785 16. Nov 2005 20:20

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?!?

Der_Unwissende 16. Nov 2005 20:42

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

Simon6785 16. Nov 2005 20:50

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

neolithos 17. Nov 2005 00:57

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.

neolithos 17. Nov 2005 03:18

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:
32         5432 7654  7654 3276
bb__ ____  gggg bbbb rrrr rrgg
Die Unterstriche stellen nullen dar.
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

Simon6785 17. Nov 2005 07:32

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!!!

neolithos 17. Nov 2005 07:47

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!

Simon6785 17. Nov 2005 08:05

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...

neolithos 17. Nov 2005 08:13

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.

Simon6785 17. Nov 2005 09:18

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!

neolithos 17. Nov 2005 09:22

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!

Simon6785 17. Nov 2005 10:04

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?

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 00:06 Uhr.
Seite 1 von 2  1 2      

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