Вот пример с GDI+. Львиную долю кода занимает заполнение матрицы 5x5.
Код: Выделить всё
PROGRAM
INCLUDE('gdiplus.inc'), ONCE
MAP
GetImageBits(STRING pImageFile, STRING pImageFormat), *STRING
GetGrayScaleBits(STRING pImageFile, STRING pImageFormat), *STRING
END
Window WINDOW('Image to GrayScale'),AT(,,206,138),CENTER,GRAY,SYSTEM, |
FONT('Segoe UI',9)
IMAGE,AT(13,13,126,103),USE(?IMAGE1)
BUTTON('Grayscale'),AT(151,33,42),USE(?btnGrayScale)
BUTTON('Colored'),AT(151,58,42),USE(?btnColored)
BUTTON('Exit'),AT(151,102,42),USE(?btnExit),STD(STD:Close)
END
imageFile STRING(FILE:MaxFilePath), AUTO
imageFormat STRING('image/png')
sourceBits &STRING !- original image bits
grayScaleBits &STRING !- grayscaled image bits
CODE
OPEN(Window)
imageFile = '.\Photo2743.png'
sourceBits &= GetImageBits(imageFile, imageFormat)
grayScaleBits &= GetGrayScaleBits(imageFile, imageFormat)
?IMAGE1{PROP:ImageBits} = sourceBits
ACCEPT
CASE ACCEPTED()
OF ?btnGrayScale
?IMAGE1{PROP:ImageBits} = grayScaleBits
OF ?btnColored
?IMAGE1{PROP:ImageBits} = sourceBits
END
END
IF NOT sourceBits &= NULL
DISPOSE(sourceBits)
END
IF NOT grayScaleBits &= NULL
DISPOSE(grayScaleBits)
END
GetImageBits PROCEDURE(STRING pImageFile, STRING pImageFormat)
bmp TGdiPlusBitmap
sBits &STRING
CODE
IF bmp.FromFile(pImageFile) = GpStatus:Ok
sBits &= bmp.ToString(pImageFormat)
END
RETURN sBits
GetGrayScaleBits PROCEDURE(STRING pImageFile, STRING pImageFormat)
bmpSrc TGdiPlusBitmap
bmpDst TGdiPlusBitmap
g TGdiPlusGraphics
matrix LIKE(typColorMatrix)
attr TGdiPlusImageAttributes
rc LIKE(GpRectF)
sBits &STRING
CODE
IF bmpSrc.FromFile(pImageFile) = GpStatus:Ok
rc.width = bmpSrc.GetWidth()
rc.height = bmpSrc.GetHeight()
bmpDst.CreateBitmap(rc.width, rc.height, PixelFormat16bppRGB555) !- format PixelFormat16bppGrayScale (and some others) returns status 3 (OutOfMemory)
g.FromImage(bmpDst)
!- gray scale conversion
attr.CreateImageAttributes()
! {
! .3f, .3f, .3f, 0, 0,
! .6f, .6f, .6f, 0, 0,
! .1f, .1f, .1f, 0, 0,
! 0, 0, 0, 1, 0,
! 0, 0, 0, 0, 1
! };
matrix.m[1][1] = 0.3
matrix.m[1][2] = 0.3
matrix.m[1][3] = 0.3
matrix.m[1][4] = 0
matrix.m[1][5] = 0
matrix.m[2][1] = 0.6
matrix.m[2][2] = 0.6
matrix.m[2][3] = 0.6
matrix.m[2][4] = 0
matrix.m[2][5] = 0
matrix.m[3][1] = 0.1
matrix.m[3][2] = 0.1
matrix.m[3][3] = 0.1
matrix.m[3][4] = 0
matrix.m[3][5] = 0
matrix.m[4][1] = 0
matrix.m[4][2] = 0
matrix.m[4][3] = 0
matrix.m[4][4] = 1
matrix.m[4][5] = 0
matrix.m[5][1] = 0
matrix.m[5][2] = 0
matrix.m[5][3] = 0
matrix.m[5][4] = 0
matrix.m[5][5] = 1
attr.SetColorMatrix(matrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap)
g.DrawImage(bmpSrc, rc, rc, UnitPixel, attr)
sBits &= bmpDst.ToString(pImageFormat)
END
RETURN sBits