Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Crear imágenes grandes con Timage (https://www.clubdelphi.com/foros/showthread.php?t=63979)

BlackDaemon 11-03-2009 16:14:44

Crear imágenes grandes con Timage
 
Hola

bueno, estoy trabajando con mapas y resulta que tengo mapas pequeños y los uno a uno solo, para eso creo un Timage, del tamaño de la suma de todos los lados x altura de los trozos, y ahí creo su tamaño total del Timage, peeero cuando son muchos trozos me da un error al querer definir el tamaño del Timage, en este caso quiero crear un Timage de 4352 px X 4352px y me da error en: Espacio insuficiente de almacenamiento para procesar este comando

¿ALguna idea de como trabajar con imágenes "muy" grandes en delphi? como de 60000 px x 60000px ? usando el método que les expliqué, osea creando el Timage y ahí ir pegando de a poco trozo por trozo.

Utilizo delphi 2009

Saludos!

MAXIUM 11-03-2009 17:08:40

Yo he tenido el mismo problema con imágenes 10 veces menores que la tuya :rolleyes:

Al final me aburrí, solo use el Image1.Picture.LoadFrom('archivo. bmp');

Cosas que podrían ayudarte:
- Usa imágenes en formato BMP, aunque ocupan más espacio de disco, consumen menos RAM y tardan menos en cargar en comparación a JPG o PNG.
- Reduce la cantidad de colores de tu imagen a 8 bit si eso no afecta a la calidad de la imagen, sino sigue subiendo a 16 o 24. Con 8 bit (indexado) consigues menos tamaño (KB, MB, etc) en imagen por ende también menos consumo de RAM.

Por falta de tiempo y cansancio no probé los siguientes métodos:

- Tratar la imagen como una página web, osea crear un html con las imagens y las ordenas, lo pruebas en tu navegador favorito a ver que tal se ve, luego en Delphi aplicas el componente WebBrowser y cargas el archivo.

- Crear un arreglo de TImages, cada uno según mis pruebas, auqnue tal vez dependa de cada equipo, soporta un máximo... de 3000x3000. En cada uno cargar la porción de imagen y crear el algoritmo que permita sincronizarlos al momento de desplazar la imagen.

BlackDaemon 11-03-2009 17:25:48

Hola

Bueno, yo no dije que necesitaba cargar/mostrar la imágen final, solamente la creo y guardo automáticamente la imágen, pero en este caso no quiere crear el Timage de la dimensión que le digo, de ahí no pasa mi código, entonces sigue la pregunta, como crear y guardar imágenes grandes, NO mostrarlas.

Saludos!

casacham 11-03-2009 17:34:47

Creo que es un verdadero rompecabezas armar ese tipo de proyecto. Lamento no poder aportar solucion, pero me parecio un proyecto muy interesante




MAXIUM 11-03-2009 17:36:58

Este... como nombraste el Timage...

Con este mismo código http://www.clubdelphi.com/foros/show...004#post341004 pero en vez de TImage, te creas otro TBitmap y haces

Bitmap.SavetoFile... o algo así :D

BlackDaemon 11-03-2009 17:47:36

Hola

Trabajo con jpgs y necesito que la salida sea este mismo formato

saludos!

cHackAll 13-03-2009 21:09:47

Aparte de haber visto este hilo y tu post te respondo;

Si tenemos 2 Gb. de memoria disponible alcanzaremos los 26000 pixeles RGB cuadrados, pero llegar a los 60000 requiere 10 Gb. de memoria que luego debe ser comprimida para obtener una imagen en formato portable (como el que exiges). Para poder convertirla debe estar en algún momento en memoria porque casi no existen conversores de formatos de imagen que trabajen sobre archivos.

Considerando que pocas PCs tienen dicha capacidad podríamos crear la imagen directamente en un archivo (.BMP) de 10 Gb. (para los 60000px cuadrados) y luego ver la forma de comprimirlo, sin embargo, el formato BMP en su cabezal tiene un campo de 32 bits que contiene el tamaño del archivo, lo que significa que el tamaño máximo de un Bitmap es de 4 Gb., lo que nos limita a un Scan Line menos que 64 Kilo pixeles cuadrados utilizando 256 colores, pero si queremos utilizar el RGB al que estamos acostumbrados solo podremos tener una imagen de 37837 pixeles cuadrados (dicha dimensión también será el limite en un SO de 32 bits) :rolleyes:

Código Delphi [-]
program BigBMP; uses Windows;

const
 Width = 37837;
 Height = 37837;

var
 Header: record
  FileHeader: TBitmapFileHeader;
  InfoHeader: TBitmapInfoHeader;
 end = (FileHeader: (bfType: $4D42 {BM}; bfSize: $FFFF367B {Width * Height * 3} + SizeOf(Header); bfOffBits: SizeOf(Header));
        InfoHeader: (biSize: SizeOf(TBitmapInfoHeader); biWidth: Width; biHeight: Height; biPlanes: 1; biBitCount: 8 * 3 {RGB}; biSizeImage: $FFFF367B));
 hFile, Size, Index: Integer;
 lpScanLine: PChar;

begin
 hFile := _lcreat('image.bmp', 0);
 _lwrite(hFile, @Header, SizeOf(Header));
 Size := Width * (Header.InfoHeader.biBitCount div 8);
 lpScanLine := Ptr(LocalAlloc(LMEM_ZEROINIT, Size));
 for Index := 1 to Height do
  _lwrite(hFile, lpScanLine, Size);
 LocalFree(Cardinal(lpScanLine));
 _lclose(hFile);
end.

Trabajando de la anterior forma, es posible ir dibujando en el BMP por cuadrantes, pero de cualquier forma no podrás abrir ni convertir el archivo… para qué hacerlo si en una resolución de monitor estándar 1600px es una dimensión grande 60000px es una utopía.

Saludos


La franja horaria es GMT +2. Ahora son las 11:29:31.

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