Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [delphi 5] TImage.Canvas e TImage.Picture

    ciao a tutti...
    devo fare un programma (e devo usare delphi 5) che permetta di effettuare un disegno, o meglio...che permetta di mettere del testo (e magari canvas generico) su un oggetto TImage e che poi ne esegua la stampa...
    ho una sola domanda:
    mmm...anzi 2
    1. è possibile effettuare delle operazioni sul canvas di un'oggetto TImage e mantenerne la trasparenza in modo da vedere gli oggetti posti sotto?
    2. xchè non mi lascia scrivere sul canvas dell'immagine se nell'immagine è caricata una Bitimap?

    in breve il mio problema è che la stampa finale risulterà su dei cartoncini colorati, sfumati etc etc etc, e, in fase di progettazione volavo lasciare all'utente finale la possibilità di vedere un'anteprima della stampa come effettivamente verrebbe sul cartoncino che lui ha in mano...
    spero d'essere stato chiaro e, soprattutto che qualcuno mi risponda e mi tolga il dubbio...ciao ciao
    La tua radio preferita sempre con te
    Forum home page
    - Provoca il più bravo ... morirai come uno schiavo (Hackers)
    - Non è la grana che ti spinge ma la voglia di essere UN NOME INCISO A FUOCO NELLA STORIA (Gemelli Diversi)

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Re: [delphi 5] TImage.Canvas e TImage.Picture

    Originariamente inviato da 3millennium
    1. è possibile effettuare delle operazioni sul canvas di un'oggetto TImage e mantenerne la trasparenza in modo da vedere gli oggetti posti sotto?
    E' possibile impostando la proprietà CopyMode dell'oggetto Pen del Canvas, ma si tratta di una funzionalità limitata rispetto all'utilizzo di un vero e proprio canale alpha.

    Originariamente inviato da 3millennium
    2. xchè non mi lascia scrivere sul canvas dell'immagine se nell'immagine è caricata una Bitimap?
    E' possibile scrivere benissimo del Bitmap...posta il codice, altrimenti non è possibile individuare l'errore.

    Originariamente inviato da 3millennium
    in breve il mio problema è che la stampa finale risulterà su dei cartoncini colorati, sfumati etc etc etc, e, in fase di progettazione volavo lasciare all'utente finale la possibilità di vedere un'anteprima della stampa come effettivamente verrebbe sul cartoncino che lui ha in mano...
    Con Delphi ho creato un'applicazione che renderizzava a video l'anteprima di uno spruzzo di aerografo su una piastrella, quindi credo di comprendere ciò di cui hai bisogno.

    Io ho utilizzato la libreria Graphics32: mette a disposizioni controlli e soprattutto classi che eseguono rendering di immagini, tracciati e scritte in modo estremamente performante. Ci ho basato l'intero package dell'applicazione di cui ti parlavo, quindi ritengo che siano affidabili, oltre ad essere freeware e OpenSource. Sul sito ci sono anche degli esempi.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    il codice è ben limitato...
    image1.picture:=image2.picture
    //in picture 2 ho caricata l'immagine che mi interessa mostrare come sfondo

    with image1.canvas do
    begin
    end

    appena arriva sul width mi da errore e dice che nn posso usare il canvas su un'immagine
    La tua radio preferita sempre con te
    Forum home page
    - Provoca il più bravo ... morirai come uno schiavo (Hackers)
    - Non è la grana che ti spinge ma la voglia di essere UN NOME INCISO A FUOCO NELLA STORIA (Gemelli Diversi)

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da 3millennium
    with image1.canvas do begin end
    appena arriva sul width mi da errore e dice che nn posso usare il canvas su un'immagine
    Quale Width?? O ti riferisci a with?
    Comunque, il costrutto with di fatto non fa nulla se non impostare un determinato "ambito" (scope); a parte questo, il Canvas è accessibile e utilizzabile, sebbene ne sconsigli l'uso poichè le operazioni grafiche apportate usando i metodi del Canvas modificano l'aspetto del controllo istantaneamente, ma vengono perse non appena il controllo necessita di un refresh (non sono persistenti).

    Meglio lavorare su un TBitmap creato separatamente al massimo, che viene poi assegnato alla proprietà Picture del controllo TImage alla fine dell'elaborazione; in questo modo, tutte le operazioni avvengono in memoria operando sul bitmap che - inizializzato all'immagine di sfondo iniziale - subisce tutte le modifiche che portano alla realizzazione dell'anteprima, la quale viene poi visualizzata assegnando il bitmap alla proprietà Picture del controllo TImage, che si occupa solo di visualizzare il risultato, e tale risultato viene sempre mostrato in fase di aggiornamento del controllo.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    ti posto in toto il codice che uso...

    With Frm_Anteprima Do
    Begin
    Image1.picture:=Nil;
    Image1.Picture:=Frm_Main.Cedola_Anteprima.Picture;
    Show;
    With Image1.Canvas Do
    Begin
    Pen.Color:=clBlack;
    Brush.Color:=clBlack;
    Rectangle(0,0,621,404);
    Pen.Color:=clWhite;
    // Brush.Color:=clWhite;
    Font.Color:=StrToIntDef(Car_colore.Text,1);
    Font.Size:=StrToIntDef(Car_Dimensione.Text,0);
    Font.Name:=Car_Nome.Text;
    Font.Style:=[];
    If Car_Grassetto.Checked Then
    Font.Style:=Font.Style+[fsBold];
    If Car_Corsivo.Checked Then
    Font.Style:=Font.Style+[fsItalic];
    If Car_Sottolineato.Checked Then
    Font.Style:=Font.Style+[fsUnderline];
    If Car_Barrato.Checked Then
    Font.Style:=Font.Style+[fsStrikeOut];
    TextOut(StrTointDef(CoordX.Text,0),StrToIntDef(Coo rdY.Text,0),TestoCarattere.Text);
    End;
    End;

    come dovrei modificare tale codice x farlo come hai detto tu?
    La tua radio preferita sempre con te
    Forum home page
    - Provoca il più bravo ... morirai come uno schiavo (Hackers)
    - Non è la grana che ti spinge ma la voglia di essere UN NOME INCISO A FUOCO NELLA STORIA (Gemelli Diversi)

  6. #6

    Errore iniziale

    ti riporto in toto l'errore:
    Project Stampe.exe raised exception class EInvalidOperation with message 'Can only modify an image if it contains a bitmap'. Process stopped. Use Step er Run to continue.

    premo ok e vedo che si è fermato sul codice
    With Cedola_Anteprima.canvas Do
    non appena vado a nominare il canvas di un TImage che contiene già un'immagine salvata questo mi sputa in un occhio
    La tua radio preferita sempre con te
    Forum home page
    - Provoca il più bravo ... morirai come uno schiavo (Hackers)
    - Non è la grana che ti spinge ma la voglia di essere UN NOME INCISO A FUOCO NELLA STORIA (Gemelli Diversi)

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Re: Errore iniziale

    Originariamente inviato da 3millennium
    ti riporto in toto l'errore:
    Project Stampe.exe raised exception class EInvalidOperation with message 'Can only modify an image if it contains a bitmap'. Process stopped. Use Step er Run to continue.
    Visto l'errore, direi che la causa è ovvia: l'immagine non è un bitmap (TBitmap).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da 3millennium

    ti posto in toto il codice che uso...
    [...]
    come dovrei modificare tale codice x farlo come hai detto tu?
    Va bene lavorare con il Canvas, ma dovresti manipolare la "tela" di un bitmap piuttosto che la "tela" del controllo visuale TImage.

    Provo a riportare un esempio (non verificato):
    codice:
    var
      Bmp: TBitmap;
    begin
      Bmp := TBitmap.Create;
      try
        // Ottengo l'immagine sorgente
        Bmp.Assign(MyImage.Picture.Bitmap);
        // Disegno ciò che serve
        with Bmp.Canvas do
        begin
          Pen.Color := clBlack;
          Brush.Color := clBlack;
          Rectangle(0,0,621,404);
          // ...
        end;
        // Visualizzo l'immagine
        DestImage.Picture.Assign(Bmp);
      finally
        Bmp.Free;
      end;
    end;
    Nell'esempio, SourceImage è un controllo TImage che contiene il bitmap di partenza; viene creata un'istanza di TBitmap a cui viene assegnata l'immagine di partenza e sulla quale, attraverso il Canvas, si eseguono le elaborazioni (che io ho tagliato). A lavoro ultimato, l'immagine elaborata viene assegnata ad un controllo DestImage di tipo TImage che si occupa di visualizzarla sullo schermo. Nel processo, il costrutto try...finally garantisce che le risorse del bitmap temporaneo di appoggio vengano rilasciate, anche in caso di errori.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    emmmmmmmmm...effettivamente è una jpg
    La tua radio preferita sempre con te
    Forum home page
    - Provoca il più bravo ... morirai come uno schiavo (Hackers)
    - Non è la grana che ti spinge ma la voglia di essere UN NOME INCISO A FUOCO NELLA STORIA (Gemelli Diversi)

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da 3millennium
    emmmmmmmmm...effettivamente è una jpg
    Non puoi lavorare direttamente su un JPEG poichè il suo formato interno non consente di elaborare pixel per pixel (per via della compressione "intrinseca").

    Credo che la mia soluzione possa venirti in aiuto anche in questo caso, poichè l'immagine JPEG viene trasformata in Bitmap consentendoti di utilizzare l'oggetto Canvas.

    Il problema successivo - che potrebbe non presentarsi - è quello di rendere più rapide le elaborazioni, che sono pesanti soprattutto se ti ritrovi con immagini molto grandi.

    In tal caso, puoi ingegnarti nell'uso della proprietà ScanLine di TBitmap per accedere in modo "bruciante" ai singoli pixel, oppure affidarti ad un package fornito da terze parti come quello che ti avevo suggerito nella prima risposta.

    A fronte di esigenze come questa, io sono abituato a seguire un'altra strada ancora: indipendentemente dall'uso o meno di librerie, creo una gerarchia di nuovi controlli visuali che contengono tutte le proprietà necessarie per eseguire l'elaborazione grafica richiesta e la sua visualizzazione; in questo modo, l'architettura dell'applicazione si mantiene sempre completamente orientata agli oggetti, senza contare l'agevolazione delle operazioni di manutenzione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.