Seen in a text editor the preamble is therefore human-radable, although the data will probably appear as weird UniCode characters..
P6 # Created by GIMP version 2.10.22 PNM plug-in 200 200 255 ÃqLÅqMÆqNÇrM¿kG¼fD¹d?´_ª....RGB data bytes....
A BMP displayed in a text editor shows nothing humanly intelligible beyond the first two bytew, 'BM'!
When coding in LB, you can create a pixel array pixel( x, y) and set values in it, then so easily save as a PBM. I have already put up the histogram /display as black-and-white based on above or below median. But I have also played with many other versions. Many can be done directly and much faster by a good painting package like PhotoShop or the GIMP. Others are up to your wild imagination- swap colors around, creat swirls and waves, modulate brightness- the sky is the limit.
' create a ppm file
' fill an image with a plain RGB color,
' set a given pixel with a color,
' get the color of a pixel.
' Bresenham draw line
' Convert image to grayscale;
' Compute the histogram
' Find the median: defined as the luminance such that the image has an approximately
' equal number of pixels with lesser and greater luminance.
' Replace each pixel of luminance lesser than the median to black, and others to white.
' Load and display a ppm file
nomainwin
dim redVal( 256), grnVal( 256), bluVal( 256)
open "lenaP6.ppm" for input as #fIn
data$ =input$( #fIn, lof( #fIn))
close #fIn
id$ =word$( data$, 1, chr$( 10))
'print id$
if id$ <>"P6" then end
comment$ =word$( data$, 2, chr$( 10))
'print comment$
size$ =word$( data$, 3, chr$( 10))
Width =val( size$)
space =instr( size$, " ")
Height =val( mid$( size$, space))
'print Width, Height
pixelData$ =word$( data$, 5, chr$( 10))
WindowWidth =1610
WindowHeight = 500
bg$ ="200 200 80"
open "Read and display ppm" for graphics_nsb as #wg
#wg "trapclose quit"
#wg "down ; fill "; bg$; " ; backcolor "; bg$
#wg "font Arial 14"
call showText 4, 220, "Read a ppm file; display greyscale brightness- " +_
"and examine fractions of each of R, G, B, and display as histogram. "+_
" Display with R and B swapped, or R inverted."
po =0
for y =0 to Height -1
for x =0 to Width -1
re =asc( mid$( pixelData$, po +1, 1)): redVal( re) =redVal( re) +re
gr =asc( mid$( pixelData$, po +2, 1)): grnVal( gr) =grnVal( gr) +gr
bl =asc( mid$( pixelData$, po +3, 1)): bluVal( bl) =bluVal( bl) +bl
#wg "color "; str$( re); " "; str$( gr); " "; str$( bl)
#wg "set "; x +2; " "; y +2
gr =asc( mid$( pixelData$, po +2, 1))
bl =asc( mid$( pixelData$, po +3, 1))
lv = int( 0.3 *re + 0.59 *gr + 0.11 *bl +0.5)
#wg "color "; str$( re); " "; str$( gr); " "; str$( bl)
#wg "set "; x +2; " "; y +2
#wg "color "; str$( lv); " "; str$( lv); " "; str$( lv)
#wg "set "; x +204; " "; y +2
#wg "color "; str$( bl); " "; str$( gr); " "; str$( re)
#wg "set "; x +1180; " "; y +2
#wg "color "; str$( 255 -re); " "; str$( gr); " "; str$( bl)
#wg "set "; x +1390; " "; y +2
#wg "color "; str$( re); " 0 0"
#wg "set "; x +500; " "; y +252
#wg "color "; "0 "; str$( lv); " 0"
#wg "set "; x +702; " "; y +252
#wg "color "; "0 0 "; str$( bl)
#wg "set "; x +904; " "; y +252
po =po +3
scan
next x
next y
oldX =410: oldYr =198: oldYg =198: oldYb =198
'#wg "size 2"
for i =0 to 255
nX = 410 +i *3
nYr =198 -int( redVal( i) /Width /Height *100)
#wg "color red ; up ; goto "; oldX; " "; oldYr
#wg "down ; goto "; nX; " "; nYr
nYg =198 -int( grnVal( i) /Width /Height *100)
#wg "color darkgreen ; up ; goto "; oldX; " "; oldYg
#wg "down ; goto "; nX; " "; nYg
nYb =198 -int( bluVal( i) /Width /Height *100)
#wg "color blue ; up ; goto "; oldX; " "; oldYb
#wg "down ; goto "; nX; " "; nYb
oldYr =nYr
oldYg =nYg
oldYb =nYb
oldX =nX
next i
#wg "flush"
wait
sub quit h$
close #wg
end
end sub
sub showText x, y, text$
#wg "up ; goto "; x; " "; y
#wg "down"
#wg "\" +text$
end sub
end
The image of Lena is on my site and is the standard image for this kind of play...