Autor Beitrag
WileECoyote
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Di 31.01.06 18:13 
Hallo zusammen,

ich habe folgendes Problem:
Ich lese bestimmte Zellen aus einer Exceldatei (in den Zellen befinden sich sowohl Text als
auch Bilder zusammen) über das Clipboard aus und stecke den Inhalt auf ein TPicture-Objekt.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type dataset = record
                ueberschrift : string;
                inhalt : Tpicture;
                quellen : string;
                fragen : string;
               end;
...
...
...
for k:=1 to x do
         begin
          setlength(data,k);          
          clipboard.Clear;
          data[k-1].ueberschrift:=myexcel.range['A'+inttostr(K),'A'+inttostr(k)].value;
          myexcel.Range['B'+inttostr(K),'B'+inttostr(k)].Copy(Emptyparam);
          data[k-1].inhalt:=Tpicture.create;
          data[k-1].inhalt.assign(clipboard);
          data[k-1].quellen:=myexcel.Range['C'+inttostr(K),'C'+inttostr(k)].Value;
          data[k-1].fragen:=myexcel.Range['D'+inttostr(K),'D'+inttostr(k)].Value;
         end;


das klapp auch wunderbar, ich kann mir den jeweiligen inhalt von data[k].inhalt auch
wunderbar auf dem formular anzeigen lassen.
ich möchte das ganze aber nun als jpg haben und zusammen mit noch diversem anderen kram
über einen filestream in einer datei speichern.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
 fs:=tfilestream.Create(dateiname,fmcreate);
 ms:=tmemorystream.Create;
 jpg:=TJpegImage.Create;
 bildstream:=Tmemorystream.Create;
 fs.WriteBuffer(x,sizeof(x));
 for i:=0 to x-1 do
  begin
   speicher.ueberschrift:=data[i].ueberschrift;
   speicher.quellen:=data[i].quellen;
   speicher.fragen:=data[i].fragen;
   jpg.Assign(<span style="color: red">data[i].inhalt.bitmap</span>);
   jpg.SaveToStream(ms);
   size:=ms.Size;
   fs.Write(size,4);
   ms.Position:=0;
   fs.CopyFrom(ms,size);
   ms.clear;
   bildstream.Clear;
   fs.WriteBuffer(speicher,sizeof(speicher));
  end;
   jpg.Free;
   ms.Free;
   fs.Free;

das problem ist nun, dass sobald ich dass mit "jpg.assign" mache, ist das bild aus data[i].inhalt weg. ich habe dann weder in data[i].inhalt noch in jpg ein bild drin.
wenn ich (rote zeile) das "bitmap" weglasse, bekomme ich einen convert-error: tpicture kann nicht zu tjpegimage zugewiesen werden". die einzige möglichkeit bisher war, anstelle
von "data[i].inhalt.bitmap" direkt "data[i].inhalt.graphic" auf den stream zu schreiben, dann kommen die bilder in die datei. hier ist dann aber das problem, dass ich das nicht mehr eingelesen bekomme. ich habe beim auslesen dann entweder eine zugriffsverletzung (wenn ich versuche, das bild aus der datei wieder auf TGraphic zuzuweisen)
oder den fehler "TMetafile kann nicht zu TBitmap zugewiesen werden". die größe (ms.size)
ist beim schreiben und lesen identisch.

kann mir hier vielleicht irgendjemand weiterhelfen? ich weiss da echt nicht weiter.
habe dass schon mal gemacht und absolut keine probleme gehabt, allerdings habe ich da initial bitmaps auf das picture-objekt gepackt. hat das clipboard evtl ein anderes format?
müßte dann aber nicht nach der ersten zuweisung auf mein tpicture-objekt das format geändert sein?

Danke und Gruß,

Wile E.

_________________
Wer in diesem Beitrag Rechtschreibfehler findet...darf sie behalten
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mi 01.02.06 09:44 
Moin,

Es befindet sich kein JPEG in der Zischenablage. Auch wenn du in Office ein JPEG eingefügt hast benutzt er immer eine Metadatei. In der ist dann zwar das JPEG eingebunden aber es isn Metafile.

Abhelfen kannst du dem in dem das Picture erst einmal auf ein Bitmap zeichnest, dann hast du auf jeden Fall ein Bitmap als kompatible grundlage. Und dieses dann auf ein JPEG zuweist. Den Umweg musst du machen, da du ein Metafile nicht direkt auf ein JPEG zuweisen kannst und auf einem JPEG auch nicht zeichnen kannst.

[edit] Könnte in etwa so aussehen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Image1Click(Sender: TObject);
var
  JPG: TJPEGImage;
  bmp: TBitmap;
begin
  Image1.Picture.Assign(Clipboard);
  Caption := Image1.Picture.Graphic.ClassName;

  bmp := TBitmap.Create;
  bmp.Width := Image1.Picture.Width;
  bmp.Height := Image1.Picture.Height;
  bmp.Canvas.Draw(0, 0, Image1.Picture.Graphic);

  JPG := TJPEGImage.Create;
  JPG.Assign(bmp);
  JPG.SaveToFile('C:\blub.jpg');
  JPG.Free;

  bmp.Free;
end;

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Mi 01.02.06 20:18 
hi,

erstmal vielen dank für deine hilfe, funktioniert auch soweit.
allerdings leidet die qualität hierbei ganz erheblich...nicht nur,
dass das jetzt alles viel pixeliger ist, vor der umwandlung
hatte ich auch keinen hintergrund, jetzt ist dieser weiss...
kann man in dieser richtung noch irgendwas ändern (quali,hintergund)
oder gibt es evtl. noch ne andere möglichkeit, bei der ich genau das erhalte,
was ich nach dem anzeigen des clipboards habe?
ich hatte schon mal versucht, das "Graphic" Objekt in den Stream zu schreiben
allerdings habe ich es nicht hinbekommen, das auch wieder auszulesen????

danke und viele grüße,

Wile E.

_________________
Wer in diesem Beitrag Rechtschreibfehler findet...darf sie behalten
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 02.02.06 12:23 
Okay. Irgendwie kann ich dir gerade nicht folgen. Wenn du aus Office ein Bild kopierst dann ist es in der Zwischenablage so große wie es auch auf dem Bildschirm ist. Dabei spielt es keine Rolle wie groß das Ursprungsbild sind.
Der Hintergrund kann zu stande kommen, wenn zum Beispiel das BMP größer ist als das eigentlich Bild. Wie auch immer das jetzt zu stande kommt.

TGraphic streamen kannste vergessen, da dahinter ein TBitmap, TMetafile, TJPEGImage stecken kann. Und beim Laden müsstest du wissen worum es sich handelt. Also lieber vorher nach JPEG Konvertieren und das sollte ausreichen.

Zur Not zeige mal bitte wie das Resultat aussieht und wie es im Office aussieht.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Do 02.02.06 18:44 
hallo,

auf die größe kommt es mir ja auch nicht an...schlimmer ist der qualitätsverlust.
habe dir mal die bilder hochgeladen, einmal das original (original.jpg), dann das
bild, dass ich erhalte, wenn ich es mit hilfe der zwischenablage in das programm
einfüge (vorher.jpg) und dann das bild, dass ich nach dem konvertieren erhalte
(nachher.jpg)
das image steht auf transparant, daher erkennt man, dass nach dem konvertieren
ein hintergrund eingefügt wurde. auch damit könnte ich leben.
ich brauche das ganze nur einmalig, um mir eine datendatei (glossar) zu erstellen,
also wenn es eine möglichkeit gibt, das metafile in die datei zu speichern und
dann im hauptprogramm irgendwie wieder auszulesen, wäre das super!!

auf jeden fall schon mal vielen dank,

gruß, Wile E.
Einloggen, um Attachments anzusehen!