[delphi6] TImage uitprinten

Pagina: 1
Acties:

  • michiel100
  • Registratie: November 2000
  • Laatst online: 27-05 08:19
Ik probeer een TImage uit te printen.

Omdat het figuur veel te klein wordt uitgeprint heb ik geprobeerd met StretchDIBits het figuur te vergroten. Maar dat had als resultaat dat het figuur een erg lage resolutie had.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
with Printer do
      begin
        BeginDoc;
        Bits := PrintImage.Picture.Bitmap.Handle;
        GetDIBSizes(Bits, InfoSize, ImageSize);
        Info := AllocMem(InfoSize);
        try
          Image := AllocMem(ImageSize);
          try
            GetDIB(Bits, 0, Info^, Image^);
            with Info^.bmiHeader do
            begin
              DIBWidth := biWidth;
              DIBHeight := biHeight;
            end;
            StretchDIBits(Canvas.Handle, 150, 150, DIBWidth*6, DIBHeight*6, 0, 0,
                  DIBWidth, DIBHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);
          finally
            FreeMem(Image, ImageSize);
          end;
        finally
          FreeMem(Info, InfoSize);
        end;
        Printer.EndDoc;
      end;
(hier wordt het image 6x uitgerekt)

Ook heb ik geprobeerd om het figuur zelf veel groter te maken, maar met als resultaat dat een bestand van ruim 20 MB naar de printer werd gestuurd.
(Image.height en Image.width aangepast)

Is hier een oplossing voor?

[ Voor 52% gewijzigd door michiel100 op 16-02-2004 09:50 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Gebruik een QuickReport om de image naar je printer te versturen? Lijkt me dat je daarmee van te voren al kunt zorgen voor een correct grootte etc. om vervolgens de print te maken.

Als je iets anders bedoelt, breidt je openingspost dan even uit: zet er wat relevante code, of een voorbeeld van wat je precies probeert te doen in.

My personal website


  • michiel100
  • Registratie: November 2000
  • Laatst online: 27-05 08:19
Ik gebruik geen TQRImage, wat zou het voordeel zijn om die te gebruiken in plaats van een TImage?

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Ik bedoel dat je een rapport aanmaakt waarmee je het plaatje kunt afdrukken. Deze image kun je (uiteraard) dynamisch inladen naar aanleiding van de image die je nodig hebt. Hiermee kun je QuickReport zich zorgen laten maken over de 'vertaling' naar de printer.

Als je probleem is dat je plaatje heel klein is, je het groot wil afdrukken en dat de kwaliteit dan bagger is: dat kun je niet oplossen. Als je gegevens niet hebt (pixelinfo), kun je ze ook niet afdrukken. Hoe beter de kwaliteit, hoe groter het bestand, hoe groter de printopdracht. Lijkt me duidelijk...

My personal website


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

TQRImage hoort bij QuickReport en is een raportgenerator. Daarmee kan je visueel zoals in Word pagina's opmaken en uitprinten.

We adore chaos because we like to restore order - M.C. Escher


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

michiel100 schreef op 16 februari 2004 @ 08:43:
Ik probeer een TImage uit te printen.

Omdat het figuur veel te klein wordt uitgeprint heb ik geprobeerd met StretchDIBits het figuur te vergroten. Maar dat had als resultaat dat het figuur een erg lage resolutie had.
En wat denk je daarmee te bereiken? :?

De gemiddelde monitor van tegenwoordig heeft een resolutie van 1280x1024 pixels en is op dat formaat een 40x30cm groot. Als je vervolgens je wallpaper naar de gemiddelde printer die 1200DPI print stuurt wordt dat plaatje dus 1x0.75 inch, oftewel ongeveer 2.5x2cm, postzegelformaat. Lijkt me logisch toch.

Vervolgens ga je je plaatje upscalen naar 4000x3000 pixels of zo, wat 4x4 oftewel 16 keer zoveel data over de lijn is: en het enige wat je hebt gedaan is iedere pixel 16 keer herhalen omdat je een programma als Photoshop nodig hebt om fatsoenlijke resampling te doen.

Klinkt toch allemaal erg logisch? :z

Wat jij gewoon wil is uit TPrinter een Canvas trekken en daar de TPicture van de TImage rechtstreeks op printen dmv StretchDraw, op de formaten die je afleidt uit de properties van TPrinter: op dat moment neemt de printerdriver de verantwoordelijk op zich om zo goed en data-zuinig mogelijk te scalen. Maar blocky blijft het totdat je een fatsoenlijke resolutie gebruikt, er gaat niet ineens uit zichzelf op magische wijze een veel scherper plaatje ontstaan dan je er origineel instopt.

Professionele website nodig?


  • michiel100
  • Registratie: November 2000
  • Laatst online: 27-05 08:19
curry684 schreef op 16 februari 2004 @ 10:16:
[...]
Maar blocky blijft het totdat je een fatsoenlijke resolutie gebruikt, er gaat niet ineens uit zichzelf op magische wijze een veel scherper plaatje ontstaan dan je er origineel instopt.
Ik heb er geen plaatje ingestopt, het is een grafiek, getekend (Canvas.LineTo(x, y);
) met enkele sinussen in een for-lus

Stel ik wil een diagonale lijn van rechtsboven naar linksonder uitprinten. Op de methode zoals ik dat wil lukt dat nooit met een redelijke resolutie.
Hetzelfde geld als ik tekst toevoeg. De tekst komt dan op papier met 14 pixels van een halve milimeter hoog, en dat is geen gezicht.

Hopelijk is m'n vraag nu duidelijker :)

[ Voor 13% gewijzigd door michiel100 op 16-02-2004 19:10 ]


  • michiel100
  • Registratie: November 2000
  • Laatst online: 27-05 08:19
Schopje?

Verwijderd

Ikzelf heb ooit eens een proggie gemaakt die alle karakters van een font in een grid in een image liet zien, waarbij datzelfde grid ook geprint kon worden. Ik heb daarvoor een routine gemaakt waarbij je de canvas waarop je het grid wilde hebben meegaf ( dus image.canvas of printer.canvas ). Is dat misschien iets om over na te denken ?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Ik had deze reactie nog niet gezien, maar alsnog antwoord dan:
michiel100 schreef op 16 februari 2004 @ 18:20:
[...]
Ik heb er geen plaatje ingestopt, het is een grafiek, getekend (Canvas.LineTo(x, y);
) met enkele sinussen in een for-lus
En? Mijn vraag blijft wat je dan met StretchDIBits probeert te bereiken. Je moet gewoon rechtstreeks op het printercanvas tekenen, dan werkt het perfect.

Als alternatief kun je ook een EMF (Enhanced MetaFile) in memory of op disk genereren en die uitprinten, dat scaled zichzelf.
Stel ik wil een diagonale lijn van rechtsboven naar linksonder uitprinten. Op de methode zoals ik dat wil lukt dat nooit met een redelijke resolutie.
Daarom zeg ik dus dat je de verkeerde methode gebruikt he ;)

Professionele website nodig?

Pagina: 1