Ver Mensaje Individual
  #7  
Antiguo 13-03-2009
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 20
cHackAll Va por buen camino
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)

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
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita