Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
No hace mucho publiqué un truco para cargar imágenes de un recurso que admitía varios formatos usando GDI+. El mensaje original en delphi y C++ se encuentra aquí:
Cargar una Imagen de un Resource RT_RCDATA con API pura y GDI+ Flat

El código es el siguiente:

El archivo de recursos RC:
Código PHP:
Imagen1 RCDATA "Imagen1.png" 
Imagen2 RCDATA "Imagen2.jpg" 
La función de carga: CreateHBITMAPFromRCDATAResurce (sobran declaraciones de APIs GDI+ pero ahí quedan por si las queréis para otros usos)
Código PHP:
#include <windows.h>

#pragma link "Gdiplus.lib"
#pragma resource "MiArchivo.res"

extern "C" {
DWORD WINAPI GdiplusStartup(ULONG_PTR *hTokenvoid *inputvoid *Output);
void  WINAPI GdiplusShutdown(ULONG_PTR token);
DWORD WINAPI GdipCreateBitmapFromHBITMAP(HBITMAP hBmpHPALETTE hPalHANDLEGBitmap);
DWORD WINAPI GdipCreateHBITMAPFromBitmap(HANDLE BmpHBITMAPhBmpDWORD BKColor);
DWORD WINAPI GdipCreateFromHDC(HDC hDCHANDLEhGraphics);
DWORD WINAPI GdipDisposeImage(HANDLE hImage);
DWORD WINAPI GdipTranslateWorldTransform(HANDLE hGraphicsfloat sxfloat syDWORD Order);
DWORD WINAPI GdipRotateWorldTransform(HANDLE hGraphicsfloat AngleDWORD Order);
DWORD WINAPI GdipDrawImage(HANDLE hGraphicsHANDLE hImagefloat sxfloat sy);
DWORD WINAPI GdipDeleteGraphics(HANDLE hGraphics);
DWORD WINAPI GdipCreateBitmapFromFile(WCHARfilenameHANDLEbitmap);
DWORD WINAPI GdipCreateHBITMAPFromBitmap(HANDLE bitmapHBITMAPhBitmapDWORD BKColor);
//DWORD WINAPI GdipCreateBitmapFromResource(HINSTANCE hInstance, WCHAR* lpBitmapName, HANDLE* GBitmap);
DWORD WINAPI GdipCreateBitmapFromStream(IStreamstreamHANDLEGBitmap);


DWORD WINAPI GdipImageRotateFlip(HANDLE hImageDWORD rfType);
}

TForm1 *Form1;

typedef struct {
  
UINT32 GdiplusVersion;
  
PVOID  DebugEventCallback;  //DebugEventProc
  
BOOL   SuppressBackgroundThread;
  
BOOL   SuppressExternalCodecs;
GdiplusStartupInput;

HBITMAP CreateHBITMAPFromRCDATAResurce(PWCHAR FileName)
{
  
PWCHAR RT_RCDATAW MAKEINTRESOURCEW(10);
  
HBITMAP hBitmap 0;
  
HANDLE GBitmap 0;
  
IStreamStream;
  
ULONG_PTR  gdiplusToken;
  
GdiplusStartupInput gdiplusStartupInput = {0};
  
gdiplusStartupInput.GdiplusVersion 1;
  if(
GdiplusStartup(&gdiplusToken, &gdiplusStartupInputNULL)) return 0;

  
HRSRC Res FindResourceW(0FileNameRT_RCDATAW);//MAKEINTRESOURCEW(10));
  
if(Res){
    
DWORD Size SizeofResource(0Res);
    
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLESize);
    
LPVOID pImage = ::GlobalLock(hMem);
    
CopyMemory(pImageLockResource(LoadResource(0Res)), Size);
    ::
GlobalUnlock(hMem);
    ::
CreateStreamOnHGlobal(hMemtrue, &Stream);
    
GdipCreateBitmapFromStream(Stream, &GBitmap);
    
GdipCreateHBITMAPFromBitmap(GBitmap, &hBitmap0);
    
GdipDisposeImage(GBitmap);
    
//GlobalFree(hMem);
    
Stream->Release();
  }

  
//shutdown GDI+
  
GdiplusShutdown(gdiplusToken);

  return 
hBitmap;

Un ejemplo de uso:
Código PHP:
Image1->Picture->Bitmap->Handle CreateHBITMAPFromRCDATAResurce(L"Imagen1"); 

Saludos.
Responder Con Cita
  #2  
Antiguo 29-11-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
Genial a todos, al final lo consegui gracias a vuestra ayuda. Ahora estoy con lo mismo pero con archivos mp3 y lo he conseguido asi:
Código PHP:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Songs.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool retval;
char my_song[]="my_song.mp3";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
    : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

bool ResToFile(char *nombre_salida,int ID)
{
    
retval=true;
    try{
        
TResourceStream *RS= new TResourceStream((unsigned int)HInstance,SONG1,RT_RCDATA);
        try{
            
RS->SaveToFile(my_song);
        }catch(...){
            
retval=false;
        }
        
delete RS;
    }catch(...){
        
retval=false;
    }
    return 
retval;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    if(
ResToFile(my_song,SONG1)==true){
        
MediaPlayer1->FileName=my_song;
        
MediaPlayer1->Open();
        
MediaPlayer1->Play();
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *SenderTCloseAction &Action)
{
    if(
retval==true){
        
MediaPlayer1->Stop();
        
MediaPlayer1->Close();
        if(
FileExists(my_song))
            
DeleteFile(my_song);
    }
}
//--------------------------------------------------------------------------- 
Solo tengo una duda y es que para reproducirla con el TMediaPlayer ¿tengo que extraerla si o si como archivo? ¿no se puede reproducir sin extraerla en un archivo?
PD: escafandra tu metodo me lo guardo para otro momento que seguro me vendrá bien pero para este son todos BMP con lo que con lo que tengo me sobra y me basta, gracias amigos.
PD2: en Song.h lo que tengo es la declaracion del ID para el recurso que es:
Código PHP:
#define SONG1 100 
Responder Con Cita
  #3  
Antiguo 29-11-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
No hace mucho publiqué un truco para cargar imágenes de un recurso que admitía varios formatos usando GDI+. El mensaje original en delphi y C++ se encuentra aquí:
Cargar una Imagen de un Resource RT_RCDATA con API pura y GDI+ Flat

El código es el siguiente:

El archivo de recursos RC:
Código PHP:
Imagen1 RCDATA "Imagen1.png" 
Imagen2 RCDATA "Imagen2.jpg" 
La función de carga: CreateHBITMAPFromRCDATAResurce (sobran declaraciones de APIs GDI+ pero ahí quedan por si las queréis para otros usos)
Código PHP:
#include <windows.h>

#pragma link "Gdiplus.lib"
#pragma resource "MiArchivo.res"

extern "C" {
DWORD WINAPI GdiplusStartup(ULONG_PTR *hTokenvoid *inputvoid *Output);
void  WINAPI GdiplusShutdown(ULONG_PTR token);
DWORD WINAPI GdipCreateBitmapFromHBITMAP(HBITMAP hBmpHPALETTE hPalHANDLEGBitmap);
DWORD WINAPI GdipCreateHBITMAPFromBitmap(HANDLE BmpHBITMAPhBmpDWORD BKColor);
DWORD WINAPI GdipCreateFromHDC(HDC hDCHANDLEhGraphics);
DWORD WINAPI GdipDisposeImage(HANDLE hImage);
DWORD WINAPI GdipTranslateWorldTransform(HANDLE hGraphicsfloat sxfloat syDWORD Order);
DWORD WINAPI GdipRotateWorldTransform(HANDLE hGraphicsfloat AngleDWORD Order);
DWORD WINAPI GdipDrawImage(HANDLE hGraphicsHANDLE hImagefloat sxfloat sy);
DWORD WINAPI GdipDeleteGraphics(HANDLE hGraphics);
DWORD WINAPI GdipCreateBitmapFromFile(WCHARfilenameHANDLEbitmap);
DWORD WINAPI GdipCreateHBITMAPFromBitmap(HANDLE bitmapHBITMAPhBitmapDWORD BKColor);
//DWORD WINAPI GdipCreateBitmapFromResource(HINSTANCE hInstance, WCHAR* lpBitmapName, HANDLE* GBitmap);
DWORD WINAPI GdipCreateBitmapFromStream(IStreamstreamHANDLEGBitmap);


DWORD WINAPI GdipImageRotateFlip(HANDLE hImageDWORD rfType);
}

TForm1 *Form1;

typedef struct {
  
UINT32 GdiplusVersion;
  
PVOID  DebugEventCallback;  //DebugEventProc
  
BOOL   SuppressBackgroundThread;
  
BOOL   SuppressExternalCodecs;
GdiplusStartupInput;

HBITMAP CreateHBITMAPFromRCDATAResurce(PWCHAR FileName)
{
  
PWCHAR RT_RCDATAW MAKEINTRESOURCEW(10);
  
HBITMAP hBitmap 0;
  
HANDLE GBitmap 0;
  
IStreamStream;
  
ULONG_PTR  gdiplusToken;
  
GdiplusStartupInput gdiplusStartupInput = {0};
  
gdiplusStartupInput.GdiplusVersion 1;
  if(
GdiplusStartup(&gdiplusToken, &gdiplusStartupInputNULL)) return 0;

  
HRSRC Res FindResourceW(0FileNameRT_RCDATAW);//MAKEINTRESOURCEW(10));
  
if(Res){
    
DWORD Size SizeofResource(0Res);
    
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLESize);
    
LPVOID pImage = ::GlobalLock(hMem);
    
CopyMemory(pImageLockResource(LoadResource(0Res)), Size);
    ::
GlobalUnlock(hMem);
    ::
CreateStreamOnHGlobal(hMemtrue, &Stream);
    
GdipCreateBitmapFromStream(Stream, &GBitmap);
    
GdipCreateHBITMAPFromBitmap(GBitmap, &hBitmap0);
    
GdipDisposeImage(GBitmap);
    
//GlobalFree(hMem);
    
Stream->Release();
  }

  
//shutdown GDI+
  
GdiplusShutdown(gdiplusToken);

  return 
hBitmap;

Un ejemplo de uso:
Código PHP:
Image1->Picture->Bitmap->Handle CreateHBITMAPFromRCDATAResurce(L"Imagen1"); 
Saludos.
Una cosa amigo, intento reproducir tu codigo y practicamente esta hecho pero me falta la libreria gdiplus.lib ¿de donde la saco? Lo digo porque me lo he bajado el GDI+ desde microsoft y no viene ningun .h ni .lib, solo viene una dll, un .cat, y un .man.

Última edición por aguml fecha: 29-11-2017 a las 15:21:41.
Responder Con Cita
  #4  
Antiguo 29-11-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
He conseguido crear el .lib asi:
implib Gdiplus.lib gdiplus.dll
y ahora me encuentro con que el codigo compila pero no encuentra el recurso con FindResource.
El archivo .rc lo tengo asi:
Código:
#include "Imagenes.h"

IMAGEN1 RCDATA "Imagenes\img1.jpg"
IMAGEN2 RCDATA "Imagenes\img2.gif"
IMAGEN3 RCDATA "Imagenes\img3.bmp"
el archivo .res obtenido ocupa lo mismo que las tres imagenes asi que supongo que lo hice bien.
En el Imagenes.h tengo esto:
Código PHP:
#define IMAGEN1 100
#define IMAGEN2 101
#define IMAGEN3 102 
Y la funcion que llama a la tuya la tengo asi:
Código PHP:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    
Image1->Picture->Bitmap->Handle CreateHBITMAPFromRCDATAResurce(L"IMAGEN3");

Algo hago mal para que no encuentre la imagen en los recursos.
Responder Con Cita
  #5  
Antiguo 29-11-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
Lo he conseguido haciendo un par de pequeños cambios.
El primero es cambiar el parametro de tu funcion por esto:
Código PHP:
HBITMAP CreateHBITMAPFromRCDATAResurce(int FileID
Luego en FinResourceW hago esto:
Código PHP:
HRSRC Res FindResourceW(0MAKEINTRESOURCEW(FileID), RT_RCDATAW); 
Y por ultimo en la llamada hago asi:
Código PHP:
Image1->Picture->Bitmap->Handle CreateHBITMAPFromRCDATAResurce(IMAGEN1); 
Donde IMAGEN1 es el id que le asigno a la primera imagen en el archivo Imagenes.h.
Me gustaria saber porque no me funciona como lo tenia ya que tampoco consegui hacerlo antes con el codigo que pasó ecfisa y tuve que hacer mas o menos lo mismo y usar el id en vez del nombre.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cargar Imagenes desde un zip a un timage. javier9090 Varios 3 19-03-2012 18:20:55
dbctrlgrid imagenes con timage amo3k OOP 2 08-02-2010 19:22:36
Crear imágenes grandes con Timage BlackDaemon Gráficos 6 13-03-2009 21:09:47
cargar diferentes imagenes en un TImage huevozen C++ Builder 3 27-07-2006 09:37:17
carga de imagenes en timage jvalles Gráficos 2 15-12-2005 19:06:57


La franja horaria es GMT +2. Ahora son las 16:25:25.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi