AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmap: falsche Farben

Bitmap: falsche Farben

Ein Thema von Sko · begonnen am 19. Nov 2006 · letzter Beitrag vom 3. Dez 2006
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Bitmap: falsche Farben

  Alt 21. Nov 2006, 23:02
Tjo, da war jemand schneller Ich hatte mir schon was in der Richtung gedacht, ich hatte mal ein ähnliches Phänomen mit WAV-Files. Da war der Header nicht wie üblich 44 sondern 46 Bytes gross. Im Header stand zwar die richtige Größe, aber der WAV-Reader setzte 44 Bytes fix voraus, so dass dann die Filegröße nicht passte, da die 2 Bytes als Sample gelesen wurden, dem dann sein Pendant für den andern Kanal fehlte. Böse Falle
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Bitmap: falsche Farben

  Alt 21. Nov 2006, 23:36
Ich versuch grad daraus eine Prozedur zum Einlesen der Bitmaps zu bauen, damit die Quelldateien nicht verändert werden, aber das ist doch nicht so einfach wie ich dachte. Na mal sehen
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
279 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: Bitmap: falsche Farben

  Alt 22. Nov 2006, 09:05
OK, bin ich mal nicht so:

Delphi-Quellcode:
function LoadBitmap24(FileName: TFileName; var Bmp: TBitmap): Boolean;
var
  fs: TFileStream;
  fh: TBitmapFileHeader;
  ih: TBitmapInfoHeader;
begin
  Result:=False;
  fs:=TFileStream.Create(FileName, fmOpenRead);
  try
    fs.Position:=0;
    fs.ReadBuffer(fh, SizeOf(fh));
    fs.ReadBuffer(ih, SizeOf(ih));
    if ih.biBitCount=24 then begin
      fs.Position:=fh.bfOffBits;
      Bmp.Width:=ih.biWidth;
      Bmp.Height:=ih.biHeight;
      Bmp.PixelFormat:=pf24bit;
      fs.ReadBuffer(Bmp.ScanLine[Bmp.Height-1]^, ih.biSizeImage);
      Result:=True;
    end;
  finally
    fs.Free;
  end;
end;
diese function geht nur bei 24bit Bitmaps, man kann das jedoch noch für andere Farbtiefen anpassen.

mfg
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Bitmap: falsche Farben

  Alt 22. Nov 2006, 10:50
Hallo, danke, ich hab auch was gebastelt, was auf dem ersten Code basiert, war doch einfacher als gedacht, ich hatte nur vergessen die Position des Streams auf 0 zu setzen vor dem Laden

Das sieht so aus:
Delphi-Quellcode:
unit BMPLaden;

interface

uses Windows, Classes, SysUtils, GR32, Graphics;

procedure BitmapLaden(Datei: TFileName; Bitmap: TBitmap); overload;
procedure BitmapLaden(Datei: TFileName; Bitmap: TBitmap32); overload;

implementation

function BitmapVerify(FileName: TFileName): TMemoryStream;
var
  fh: TBitmapFileHeader;
  ih: TBitmapInfoHeader;
  Offset: DWORD;
  Buffer: Pointer;
begin
  result := TMemoryStream.Create;
  result.LoadFromFile(FileName);
  try
    result.Position:=0;
    result.ReadBuffer(fh, SizeOf(fh));
    result.ReadBuffer(ih, SizeOf(ih));
    Offset:=fh.bfOffBits-(SizeOf(TBitmapFileHeader)+SizeOf(TBitmapInfoHeader));
    if Offset>0 then begin
      GetMem(Buffer, ih.biSizeImage);
      try
        result.Position:=fh.bfOffBits;
        result.ReadBuffer(Buffer^, ih.biSizeImage);
        fh.bfSize:=fh.bfSize-Offset;
        fh.bfOffBits:=fh.bfOffBits-Offset;
        result.Position:=0;
        result.WriteBuffer(fh, SizeOf(fh));
        result.Position:=fh.bfOffBits;
        result.WriteBuffer(Buffer^, ih.biSizeImage);
        result.Size:=fh.bfSize;
      finally
        FreeMem(Buffer, ih.biSizeImage);
      end;
    end;
  finally
    result.Position := 0; //<---hatte ich vergessen^^
  end;
end;


procedure BitmapLaden(Datei: TFileName; Bitmap: TBitmap);
var
  BitmStream: TMemoryStream;
begin
  BitmStream := BitmapVerify(Datei);
  Bitmap.LoadFromStream(BitmStream);
  FreeAndNil(BitmStream);
end;

procedure BitmapLaden(Datei: TFileName; Bitmap: TBitmap32);
var
  BitmStream: TMemoryStream;
begin
  BitmStream := BitmapVerify(Datei);
  Bitmap.LoadFromStream(BitmStream);
  FreeAndNil(BitmStream);
end;

end.
Ich hab das noch nicht mit anderen Bitmaps testen können, weil ich keine Bitmaps mit weniger als 24 bit habe bei denen das Problem auftaucht.

Vielen Dank nochmal für deine Hilfe
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
279 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: Bitmap: falsche Farben

  Alt 22. Nov 2006, 11:37
@Sko: Ja so kann man es auch machen. Ich weiß jetzt nicht ob dir die Ladegeschwindigkeit wichtig ist? denn bei deinem code werden unnötige kopiervorgänge im speicher durchgeführt, das habe ich bei meinem code LoadBitmap24 vermieden

mfg
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Bitmap: falsche Farben

  Alt 22. Nov 2006, 12:13
Hmm, ich erstelle auch Thumbs damit, also wäre etwas schneller auch nicht schlecht... aber da müsste ich vor dem Laden mit deiner Funktion Herausfinden wieviel Bit das Bitmap hat, und dafür müsste ich es ja wieder in einen Stream laden um das auszulesen, bevor ich´s mit deiner Funktion laden kann, oder?

[Edit]und mit Bitmap32 musses auch gehen und da hab ich kein Pixelformat [/Edit]

[Edit2]Ok, das mit den Bits hat sich erledigt, habs übersehen, das steht ja da:
Delphi-Quellcode:
if ih.biBitCount=24 then begin
...
[/Edit2]
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
279 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: Bitmap: falsche Farben

  Alt 22. Nov 2006, 13:09
Für TBitmap32 könnte es so aussehen:
Delphi-Quellcode:
function LoadBitmap32(FileName: TFileName; var Bmp32: TBitmap32): Boolean;
var
  Bmp24: TBitmap;
begin
  Bmp24:=TBitmap.Create;
  try
    LoadBitmap24(FileName, Bmp24);
    Bmp32.Assign(Bmp24);
  finally
    Bmp24.Free;
  end;
end;
Habs zwar nicht getestet, aber müsste gehen.

mfg
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Bitmap: falsche Farben

  Alt 22. Nov 2006, 13:43
Stimmt, danke, ich hab mal wieder zu kompliziert gedacht
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Bitmap: falsche Farben

  Alt 3. Dez 2006, 13:00
hier noch die ein-Zeilen-Variante , danke Sunlight7
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf