AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bestimmte Grafik aus einer einzigen Resource laden?
Thema durchsuchen
Ansicht
Themen-Optionen

Bestimmte Grafik aus einer einzigen Resource laden?

Ein Thema von stOrM · begonnen am 6. Jul 2008 · letzter Beitrag vom 11. Jul 2008
Antwort Antwort
Seite 2 von 2     12   
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#11

Re: Bestimmte Grafik aus einer einzigen Resource laden?

  Alt 10. Jul 2008, 12:05
Aber ehrlich - einfacher wäre es doch aus den png bildern einen memory stream zu erstellen.
dh. alle png bilder hintereinander in einen stream schreiben und sich irgend ein protokoll zum auslesen überlegen.

am einfachsten wäre es wohl am stream anfang zu schreiben:
bild1:250
bild2:350
bild3:200
startofstream
binärdaten.........

und die angabe in bytes zu haben.
dann kannst du dir die bilder einfach so aus dem stream holen und einfach in ein png einfügen.
den stream kannst du als ganzes in eine recource schreiben.

Das ist meiner meinung nach einfacher und universeller als dieses bild hin und herkopieren.

lg
Arnulf
Edit:
oder noch einfacher - 2 recourcen
1. ist eine größenangabe der einzelnen bilder
bild250bild300bild200
da du hier nur zahlen und eindeutige buchstaben hast kann im protokoll zum auslesen nicht viel passieren.
2. die binärdaten wobei bild1 dann 250 bytes hat bild2 dann 300 bytes usw...
damit kannst du dirrekt aus dem stream das bild lesen und auch zuweisen.

irgend sowas...
  Mit Zitat antworten Zitat
rotfc
(Gast)

n/a Beiträge
 
#12

Re: Bestimmte Grafik aus einer einzigen Resource laden?

  Alt 10. Jul 2008, 12:22
Noch eine Spur einfacher wäre es wohl, die *.res-Datei selbst zu erstellen statt die eines fremden Programms "hacken" zu wollen

Ansonsten: Die eine PNG aus der *.res in ein unsichtbares Image laden und dann dort in Einzelteile (vorzugsweise für ImageLists) zerpflücken?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#13

Re: Bestimmte Grafik aus einer einzigen Resource laden?

  Alt 10. Jul 2008, 12:57
Delphi-Quellcode:
type
  TRectArray = array of TRect;
  TBitmapArray = array of TBitmap;

// Zwei Funktionen die Rechtecke aufbereiten:
function FixRect(SrcRect: TRect): TRect;
  procedure Switch(var a,b: integer);
  var c: integer;
  begin
    c := a; a := b; b := c;
  end;
begin
  if SrcRect.Left > SrcRect.Right then
    Switch(SrcRect.Left,SrcRect.Right);
  if SrcRect.Top > SrcRect.Bottom then
    Switch(SrcRect.Top,SrcRect.Bottom);
  result := SrcRect;
end;
function TrimRect(SrcRect: TRect; minx,miny,maxx,maxy: integer): TRect;
begin
  result := fixrect(srcrect);
  if result.Left < minx then result.left := minx;
  if result.top < miny then result.top := miny;
  if result.right > maxx then result.right := maxx;
  if result.bottom > maxy then result.bottom := maxy;
end;

// Stanzt die in SrcRect übergebenen rechtecke aus SrcPNG aus und lädt sie ins
// DstBitmapArray
procedure GetBitmaps(const SrcPNG: TPNGObject; const SrcRects: TRectArray;
  var DstBitmapArray: TBitmapArray);
var
  i: integer;
  Rct: TRect;
  Bmp: TBitmap;
begin
  // Bitmap vom PNG Erzeugen
  Bmp := TBitmap.Create;
  Bmp.Assign(SrcPNG);
  // Länge der auszugebenden Bilderliste festlegen (=Anzahl der Rechtecke)
  setlength(DstBitmapArray,high(SrcRects)+1);
  for i := 0 to high(SrcRects) do
  begin
    // Bitmap erzeugen
    DstBitmapArray[i] := TBitmap.Create;
    // Rechteck vorbereiten mit obigen Funktionen (ggf Zurechtschneiden,
    // falls es über die Grenzen des PNGs hinausgeht)
    Rct := TrimRect(SrcRects[i],0,0,SrcPng.Width,SrcPNG.Height);
    // Größe des Bitmaps setzen
    DstBitmapArray[i].SetSize(rct.Right-rct.left,rct.bottom-rct.top);
    // rechteck ausstanzen und auf Bitmap kopieren
    BitBlt(DstBitmapArray[i].Canvas.Handle,0,0,DstBitmapArray[i].width,
      DstBitmapArray[i].Height,bmp.Canvas.handle,rct.left,rct.top,srccopy);
  end;
  Bmp.free;
end;

// Stanzt ebenfalls Bilder aus dem PNG aus, die rechtecke werden aber im
// Parameter Positions testbasiert übergeben. jede Zeile definiert ein rechteck
// Die Koordinaten des Rechtecks werden in der reihenfolge Left, Top, Right, Bottom
// angegeben und durch Kommata separiert. Beispiel:
// 0,0,100,50
// 100,0,100,100
// etc...
procedure LoadBitmaps(const SrcPNG: TPNGObject; const Positions: TStrings;
  var DstBitmapArray: TBitmapArray);
var
  i: integer;
  l: integer;
  rectarray: TRectArray;
  tmp: tstringlist;
begin
  setlength(rectarray,positions.Count);
  l := 0;
  tmp := tstringlist.Create;
  tmp.Delimiter := ',';
  for i := 0 to positions.count - 1 do
  begin
    tmp.DelimitedText := Positions[i];
    if TryStrToInt(trim(tmp[0]),rectarray[l].Left) and
       TryStrToInt(trim(tmp[1]),rectarray[l].Top) and
       TryStrToInt(trim(tmp[2]),rectarray[l].Right) and
       TryStrToInt(trim(tmp[3]),rectarray[l].Bottom) then
      inc(l);
  end;
  setlength(rectarray,l);
  GetBitmaps(srcpng,rectarray,dstbitmaparray);
  tmp.free;
end;
Ein einfach gehaltenes Beispiel. listen wären besser als Arrays, hätten den Code aber zu sehr aufgebläht. (Wie fast immer bei mir) ist das ganze ungetestet, aber zumindest das Prinzip sollte klar sein.

Wobei die Lösung per Memorystream sowohl im Aufwand als auch in der Dateigröße allerdings elegeanter ist... In einem meiner eigenen projekte habe ich es mit XML gelöst (was aber den nachteil hat, dass Binärdateien Base64 enkodiert werden, was wieder etwas speicher kostet.) Aber das Schöne an objektorientierter Programmierung ist ja, dass ich die Klasse bei bedarf einfach austauschen könnte
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#14

Re: Bestimmte Grafik aus einer einzigen Resource laden?

  Alt 11. Jul 2008, 15:38
Zitat von rotfc:
Noch eine Spur einfacher wäre es wohl, die *.res-Datei selbst zu erstellen statt die eines fremden Programms "hacken" zu wollen

Ansonsten: Die eine PNG aus der *.res in ein unsichtbares Image laden und dann dort in Einzelteile (vorzugsweise für ImageLists) zerpflücken?
Kann ruhig jeder Wissen, das die Res von Devexpress ist für Ribbons, nur für die Frage dich ich hier gepostet hab, lohnt es nicht wirklich jetzt Photoshop anzuwerfen und erstmal Buttons zu malen und ggf so anzurodnen wie die Res von Devexpress oder? Mir gehts nur darum wie man so eine Res ausliest und die ausgelesenen Sachen z.B. auf nen Bitmap32 Object wieder anordnet die Res von DE interessiert mich nicht wirklich...

VG
s!
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#15

Re: Bestimmte Grafik aus einer einzigen Resource laden?

  Alt 11. Jul 2008, 15:39
Zitat von NamenLozer:
Delphi-Quellcode:
type
  TRectArray = array of TRect;
  TBitmapArray = array of TBitmap;

// Zwei Funktionen die Rechtecke aufbereiten:
function FixRect(SrcRect: TRect): TRect;
  procedure Switch(var a,b: integer);
  var c: integer;
  begin
    c := a; a := b; b := c;
  end;
begin
  if SrcRect.Left > SrcRect.Right then
    Switch(SrcRect.Left,SrcRect.Right);
  if SrcRect.Top > SrcRect.Bottom then
    Switch(SrcRect.Top,SrcRect.Bottom);
  result := SrcRect;
end;
function TrimRect(SrcRect: TRect; minx,miny,maxx,maxy: integer): TRect;
begin
  result := fixrect(srcrect);
  if result.Left < minx then result.left := minx;
  if result.top < miny then result.top := miny;
  if result.right > maxx then result.right := maxx;
  if result.bottom > maxy then result.bottom := maxy;
end;

// Stanzt die in SrcRect übergebenen rechtecke aus SrcPNG aus und lädt sie ins
// DstBitmapArray
procedure GetBitmaps(const SrcPNG: TPNGObject; const SrcRects: TRectArray;
  var DstBitmapArray: TBitmapArray);
var
  i: integer;
  Rct: TRect;
  Bmp: TBitmap;
begin
  // Bitmap vom PNG Erzeugen
  Bmp := TBitmap.Create;
  Bmp.Assign(SrcPNG);
  // Länge der auszugebenden Bilderliste festlegen (=Anzahl der Rechtecke)
  setlength(DstBitmapArray,high(SrcRects)+1);
  for i := 0 to high(SrcRects) do
  begin
    // Bitmap erzeugen
    DstBitmapArray[i] := TBitmap.Create;
    // Rechteck vorbereiten mit obigen Funktionen (ggf Zurechtschneiden,
    // falls es über die Grenzen des PNGs hinausgeht)
    Rct := TrimRect(SrcRects[i],0,0,SrcPng.Width,SrcPNG.Height);
    // Größe des Bitmaps setzen
    DstBitmapArray[i].SetSize(rct.Right-rct.left,rct.bottom-rct.top);
    // rechteck ausstanzen und auf Bitmap kopieren
    BitBlt(DstBitmapArray[i].Canvas.Handle,0,0,DstBitmapArray[i].width,
      DstBitmapArray[i].Height,bmp.Canvas.handle,rct.left,rct.top,srccopy);
  end;
  Bmp.free;
end;

// Stanzt ebenfalls Bilder aus dem PNG aus, die rechtecke werden aber im
// Parameter Positions testbasiert übergeben. jede Zeile definiert ein rechteck
// Die Koordinaten des Rechtecks werden in der reihenfolge Left, Top, Right, Bottom
// angegeben und durch Kommata separiert. Beispiel:
// 0,0,100,50
// 100,0,100,100
// etc...
procedure LoadBitmaps(const SrcPNG: TPNGObject; const Positions: TStrings;
  var DstBitmapArray: TBitmapArray);
var
  i: integer;
  l: integer;
  rectarray: TRectArray;
  tmp: tstringlist;
begin
  setlength(rectarray,positions.Count);
  l := 0;
  tmp := tstringlist.Create;
  tmp.Delimiter := ',';
  for i := 0 to positions.count - 1 do
  begin
    tmp.DelimitedText := Positions[i];
    if TryStrToInt(trim(tmp[0]),rectarray[l].Left) and
       TryStrToInt(trim(tmp[1]),rectarray[l].Top) and
       TryStrToInt(trim(tmp[2]),rectarray[l].Right) and
       TryStrToInt(trim(tmp[3]),rectarray[l].Bottom) then
      inc(l);
  end;
  setlength(rectarray,l);
  GetBitmaps(srcpng,rectarray,dstbitmaparray);
  tmp.free;
end;
Ein einfach gehaltenes Beispiel. listen wären besser als Arrays, hätten den Code aber zu sehr aufgebläht. (Wie fast immer bei mir) ist das ganze ungetestet, aber zumindest das Prinzip sollte klar sein.

Wobei die Lösung per Memorystream sowohl im Aufwand als auch in der Dateigröße allerdings elegeanter ist... In einem meiner eigenen projekte habe ich es mit XML gelöst (was aber den nachteil hat, dass Binärdateien Base64 enkodiert werden, was wieder etwas speicher kostet.) Aber das Schöne an objektorientierter Programmierung ist ja, dass ich die Klasse bei bedarf einfach austauschen könnte
Schau ich mir am WE an vielen Dank erstmal für deine Mühe, bin mal gespannt obs hinhaut
VG
s!
  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 06:16 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