symbian中如何将两张图片合成一张

时间:2022-06-19 14:51:20
我想在symbian应用程序中,通过直接对bitmap数据进行操作的方式,来将两张图片合成一张。但是如何用算法实现。还请各位大侠帮忙。如果谁有实现代码麻烦发到我的邮箱tiger099104@yahoo.com.cn,不胜感激!!!!

11 个解决方案

#1


没有代码,不过可以给你一个思路:

不知道你合并说是重叠还是拼图?如果只是小图拼大图,直接作一个大的缓冲,然后上面draw一个,下面draw一个应该就可以了。
如果是重叠,可以设置一下绘图的模式,在同一位置将两张图draw一下应该也可以。

没试过,你试试看吧。

#2


谢谢您的解答,我是想把图片1的各个像素点的rgb信息放到图片2中,使他们成为一张图片,并保存。
我听说window中有个alpha混合技术,不知道在symbian中可不可以通用。

#3


参考SDK中关于CWindowGc的说明,它有一个 SetDrawMode ,你看看,里面有alpha的说明。可以写点代码试一下。

#4


我最后想把两张图片保存成一张,需要直接对两张图片的各个点的像素rgb值进行操作,以下是我写的代码。

void MyFunction()
{
delete bitmap3
bitmap3= NULL;

bitmap3= new(ELeave)CFbsBitmap();

bitmap2= &(iModel.GetDecoratedImage());

//src bitmap size
TSize bitmapSize = bitmap1->SizeInPixels();
TInt srcX = bitmapSize.iWidth;
TInt srcY = bitmapSize.iHeight;

User::LeaveIfError(bitmap3->Create(TSize(bitmapSize.iWidth, bitmapSize.iHeight), EColor16M));

TRgb bitmap1Rgb(0, 0, 0);
TRgb bitmap2Rgb(0, 0, 0);
TRgb bitmap3Rgb(0, 0, 0);

//bitmap1 rgb value
TInt bitmap1Red = 0;
TInt bitmap1Blue = 0;
TInt bitmap1Green = 0;

//bitmap2 rgb value
TInt bitmap2Red = 0;
TInt bitmap2Blue = 0;
TInt bitmap2Green = 0;

//bitmap3 rgb value
TInt bitmap3Red = 0;
TInt bitmap3Blue = 0;
TInt bitmap3Green = 0;

TInt alpha = 255;

//material bitmap size
TSize materialpSize = bitmap2->SizeInPixels();
TInt desX = materialpSize.iWidth;
TInt desY = materialpSize.iHeight;

// create the bitmap utils
TBitmapUtil decodedUtil(bitmap1);
TBitmapUtil decoratedUtil(bitmap2);
TBitmapUtil newUtil(bitmap2);


decodedUtil.Begin(TPoint(0, 0));
decoratedUtil.Begin(TPoint(0, 0), decodedUtil); 
newUtil.Begin(TPoint(0, 0), decodedUtil);

for(TInt yPos = 0; yPos < srcY; yPos++)
{
decodedUtil.SetPos(TPoint(0, yPos));
decoratedUtil.SetPos(TPoint(0, yPos));
newUtil.SetPos(TPoint(0, yPos));

for(TInt xPos = 0; xPos < srcX; xPos++)
{
bitmap1->GetPixel(bitmap1Rgb, TPoint(xPos, yPos));

bitmap1Red = bitmap1Rgb.Red();
bitmap1Blue = bitmap1Rgb.Blue();
bitmap1Green = bitmap1Rgb.Green();


bitmap2Image->GetPixel(bitmap2Rgb, TPoint(xPos, yPos));

bitmap2Red = bitmap2Rgb.Red();
bitmap2Blue = bitmap2Rgb.Blue();
bitmap2Green = bitmap2Rgb.Green();


//mix color
bitmap3Red = (bitmap1Red * alpha + bitmap2Red * (255 - alpha)) / 255;
bitmap3Blue = (bitmap1Blue * alpha + bitmap2Blue * (255 - alpha)) / 255;
bitmap3Green = (bitmap1Green * alpha + bitmap2Green * (255 - alpha)) / 255;

bitmap3Rgb.SetRed(bitmap3Red);
bitmap3Rgb.SetBlue(bitmap3Blue);
bitmap3Rgb.SetGreen(bitmap3Green);

newUtil.SetPixel(bitmap3Rgb.Value());

decodedUtil.IncXPos();
decoratedUtil.IncXPos();
newUtil.IncXPos();
}
}
decodedUtil.End();
decoratedUtil.End();
newUtil.End();

iModel.SetNewImage(bitmap3Bitmap);

}

该函数是通过alpha混合原理来实现,但是效果并不是很理想。图片有点发蓝,使怎么回事啊,谢谢各位大虾解答。

难道symbian对图像处理这方面支持的不够好吗。

#5



gc.BitBlt(TPoint(0,0),iBkImage);

gc.SetDrawMode(CWindowGc::EDrawModeNOTORNOT);
gc.BitBlt(TPoint(0,40),iBkImageMask);

我是这样试的,两张图重叠部分,其中第二张图用NOTORNOT模式,你可以换一个模式来试验。

#6


非常感谢这位朋友的指点。我再试试。

#7


建议看下EXAMPLE2D

#8


非常感谢楼上朋友们的回答。

#9


有问题请先GOOGLE,BAIDU

#10


不明LZ在说什么

#11


楼上的外行就别在这掺和,浪费时间。
本帖已结。

#1


没有代码,不过可以给你一个思路:

不知道你合并说是重叠还是拼图?如果只是小图拼大图,直接作一个大的缓冲,然后上面draw一个,下面draw一个应该就可以了。
如果是重叠,可以设置一下绘图的模式,在同一位置将两张图draw一下应该也可以。

没试过,你试试看吧。

#2


谢谢您的解答,我是想把图片1的各个像素点的rgb信息放到图片2中,使他们成为一张图片,并保存。
我听说window中有个alpha混合技术,不知道在symbian中可不可以通用。

#3


参考SDK中关于CWindowGc的说明,它有一个 SetDrawMode ,你看看,里面有alpha的说明。可以写点代码试一下。

#4


我最后想把两张图片保存成一张,需要直接对两张图片的各个点的像素rgb值进行操作,以下是我写的代码。

void MyFunction()
{
delete bitmap3
bitmap3= NULL;

bitmap3= new(ELeave)CFbsBitmap();

bitmap2= &(iModel.GetDecoratedImage());

//src bitmap size
TSize bitmapSize = bitmap1->SizeInPixels();
TInt srcX = bitmapSize.iWidth;
TInt srcY = bitmapSize.iHeight;

User::LeaveIfError(bitmap3->Create(TSize(bitmapSize.iWidth, bitmapSize.iHeight), EColor16M));

TRgb bitmap1Rgb(0, 0, 0);
TRgb bitmap2Rgb(0, 0, 0);
TRgb bitmap3Rgb(0, 0, 0);

//bitmap1 rgb value
TInt bitmap1Red = 0;
TInt bitmap1Blue = 0;
TInt bitmap1Green = 0;

//bitmap2 rgb value
TInt bitmap2Red = 0;
TInt bitmap2Blue = 0;
TInt bitmap2Green = 0;

//bitmap3 rgb value
TInt bitmap3Red = 0;
TInt bitmap3Blue = 0;
TInt bitmap3Green = 0;

TInt alpha = 255;

//material bitmap size
TSize materialpSize = bitmap2->SizeInPixels();
TInt desX = materialpSize.iWidth;
TInt desY = materialpSize.iHeight;

// create the bitmap utils
TBitmapUtil decodedUtil(bitmap1);
TBitmapUtil decoratedUtil(bitmap2);
TBitmapUtil newUtil(bitmap2);


decodedUtil.Begin(TPoint(0, 0));
decoratedUtil.Begin(TPoint(0, 0), decodedUtil); 
newUtil.Begin(TPoint(0, 0), decodedUtil);

for(TInt yPos = 0; yPos < srcY; yPos++)
{
decodedUtil.SetPos(TPoint(0, yPos));
decoratedUtil.SetPos(TPoint(0, yPos));
newUtil.SetPos(TPoint(0, yPos));

for(TInt xPos = 0; xPos < srcX; xPos++)
{
bitmap1->GetPixel(bitmap1Rgb, TPoint(xPos, yPos));

bitmap1Red = bitmap1Rgb.Red();
bitmap1Blue = bitmap1Rgb.Blue();
bitmap1Green = bitmap1Rgb.Green();


bitmap2Image->GetPixel(bitmap2Rgb, TPoint(xPos, yPos));

bitmap2Red = bitmap2Rgb.Red();
bitmap2Blue = bitmap2Rgb.Blue();
bitmap2Green = bitmap2Rgb.Green();


//mix color
bitmap3Red = (bitmap1Red * alpha + bitmap2Red * (255 - alpha)) / 255;
bitmap3Blue = (bitmap1Blue * alpha + bitmap2Blue * (255 - alpha)) / 255;
bitmap3Green = (bitmap1Green * alpha + bitmap2Green * (255 - alpha)) / 255;

bitmap3Rgb.SetRed(bitmap3Red);
bitmap3Rgb.SetBlue(bitmap3Blue);
bitmap3Rgb.SetGreen(bitmap3Green);

newUtil.SetPixel(bitmap3Rgb.Value());

decodedUtil.IncXPos();
decoratedUtil.IncXPos();
newUtil.IncXPos();
}
}
decodedUtil.End();
decoratedUtil.End();
newUtil.End();

iModel.SetNewImage(bitmap3Bitmap);

}

该函数是通过alpha混合原理来实现,但是效果并不是很理想。图片有点发蓝,使怎么回事啊,谢谢各位大虾解答。

难道symbian对图像处理这方面支持的不够好吗。

#5



gc.BitBlt(TPoint(0,0),iBkImage);

gc.SetDrawMode(CWindowGc::EDrawModeNOTORNOT);
gc.BitBlt(TPoint(0,40),iBkImageMask);

我是这样试的,两张图重叠部分,其中第二张图用NOTORNOT模式,你可以换一个模式来试验。

#6


非常感谢这位朋友的指点。我再试试。

#7


建议看下EXAMPLE2D

#8


非常感谢楼上朋友们的回答。

#9


有问题请先GOOGLE,BAIDU

#10


不明LZ在说什么

#11


楼上的外行就别在这掺和,浪费时间。
本帖已结。