我知道 - 标题可能听起来很奇怪.让我解释:
我创建了一个图像来向您展示我正在谈论的内容:

我有一个图像(位图(1)),大小为150w/200h.
现在我需要使位图更大((2)400w/400h),但原始图像必须具有相同的大小.使图像嵌入白色背景中.
我认为解决它的一种方法是:*创建一个大位图*为它创建一个画布*在画布上绘制原始位图*绘制画布*生成画布的位图
对我来说问题是,它必须在后台线程中完成而不绘制视图.我希望你能理解我.
我必须将位图的像素转换为短阵列.因此我想:
这是获取字节的源码:
public byte[] BitmapToByte(Bitmap source)
{
using (var memoryStream = new MemoryStream())
{
source.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
return memoryStream.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
这不会返回预期的结果.还有另一种转换数据的方法吗?
使用Bitmap.create创建位图(25,25,Config.ARGB_8888)
设置一个alpha值小于或等于0xA9的像素会导致像素没有被传入的内容设置.我读了另一个堆栈溢出问题说setHasAlpha(true),我在测试中做了 - 但是仍然没有解决这个问题.
这是我的android测试用例,显示了我的问题:
public void testSettingBitmaps() {
Bitmap bitmap = Bitmap.createBitmap(25, 25, Config.ARGB_8888);
bitmap.setHasAlpha(true);
int color = 0x00fefefe;
int x= 0;
int y = 0;
for(int alpha = 0xFF000000; alpha != 0x00000000; alpha = alpha - 0x01000000) {
int colorPlusAlpha = color + alpha;
bitmap.setPixel(x, y, colorPlusAlpha);
//
// This test succeeds if the bitmap let us set the pixel.
//
assertEquals(String.format("Current alpha value: %x, Expected pixel value: %x, Actual pixel value: %x", alpha, colorPlusAlpha, bitmap.getPixel(x, y)),
colorPlusAlpha, …Run Code Online (Sandbox Code Playgroud) 当我尝试创建一个Bitmap并通过"get"访问器返回它时,我得到一个Out Of Memory Exception.位图的大小为640x480,深度为Int32.
我怀疑C#垃圾收集器无法删除这些旧的位图,因为它们是在我的变量的访问器中返回的.我有超过2GB的可用空间,所以我不认为这个"小"图像占用太多内存.不幸的是,由于线程锁定问题,我必须重新创建Bitmap(在线程之间锁定图像时出现问题)代码如下:
public Bitmap LiveFrame { get { return GetFrame(500); } }
Run Code Online (Sandbox Code Playgroud)
.....
private Bitmap GetFrame(int timeout)
{
Bitmap ret = null;
//CLEyeCameraGetFrame places image data into this._PrivateBitmap
bool success = CLEyeCameraGetFrame(_Camera, _PtrBmpPixels, timeout);
if(success)
ret = new Bitmap(this._PrivateBitmap);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
关于非托管代码的注意事项:CLEyeCameraGetFrame位于非托管DLL中.我在代码中使用Marshal.AllocHGlobal分配_PtrBmpPixels,并且在关闭应用程序时释放之前不要触摸它._PtrBmpPixels用于通过其接受IntPtr参数"scan0"的构造函数创建Bitmap _PrivateBitmap.因此,每当通过CLEyeCameraGetFrame更新_PtrBmpPixels时,_PrivateBitmap也会更新.
我尝试通过在重用之前处理PcitureBox位图来解决这个问题,但这打破了PictureBox的显示.我有两个线程更新两个不同的PictureBox/ImageBoxes:
lock (_CameraLocker)
{
if (_VideoPlaying)
{
try{
if (pbLiveFeed.Image != null)
pbLiveFeed.Image.Dispose();
pbLiveFeed.Image = _Camera.LiveFrame;
pbLiveFeed.Invalidate();
}catch (Exception ex) { }
}
Run Code Online (Sandbox Code Playgroud)
....
lock (_CameraLocker)
{
try{
if (ibProcessed.Image != …Run Code Online (Sandbox Code Playgroud) 如何在Delphi中将颜色减少到指定的数字(<= 256)?我不想只使用:
Bmp.PixelFormat := pf8bit;
Run Code Online (Sandbox Code Playgroud)
因为那样我无法控制颜色数量.我不想要抖动,因为我已经知道如何用256或更少颜色抖动图像.
我发现了这个Median Cut实现,但它从1990年开始是纯粹的Pascal,并且:
我想TBitmap32只减少(Graphics32位图类,仅支持32位颜色)到<= 8bit bmp.我不需要减少到15/16bit,我不需要从24或15/16bit图像减少.只需32位=> 8位 -
Delphi我使用:7,2005,XE3.
我正在使用一些Acitivity,它工作得很好.但我有一个奇怪的延迟.
我想通了,这是关于代码的这一部分,我在SDCard中加载存储的图像.
if(p.getAdress() != null){
Bitmap bitmap = BitmapFactory.decodeFile(p.getAdress());
new_image.setBackgroundDrawable(null);
new_image.setImageBitmap(bitmap);
}
Run Code Online (Sandbox Code Playgroud)
为什么这个简单的代码执行时间太长?
怎么解决?
如果我取消这个代码,一切都按照我的意愿行事.
我有一个300 x 355的图像,大小只有50 kb.我试图用下面的代码解码它:
Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId)
.copy(Bitmap.Config.ARGB_8888, true);
Run Code Online (Sandbox Code Playgroud)
根据logcat尝试分配10674000字节.为什么这么多?图像只有50 kb.
你好,我有两个图像,我正在使用画布合并图像
这是下面的代码
Intent intent = getIntent();
//bm is the image get from camera
bm = BitmapFactory.decodeFile(intent.getStringExtra("getdata"));
//this is simple white text image
bm1 = BitmapFactory.decodeResource(getResources(), R.drawable.txt_made_hawk_nelson);
imgSeletedPhoto = (ImageView) findViewById(R.id.imgSelectedPhoto);
int width = bm.getWidth();
int height = bm.getHeight();
int maxWidth = (width > bm1.getWidth() ? width : bm1.getWidth());
int maxHeight = (height > bm1.getHeight() ? height : bm1.getHeight());
// calculate the scale - in this case = 0.4f
float scaleWidth = ((float) maxWidth) / width;
float scaleHeight = ((float) maxHeight) …Run Code Online (Sandbox Code Playgroud) 单击鼠标左键时,不会显示位图.我正在使用visual c ++ express
HDC DC, memDC;
switch(message) {
case WM_CREATE:
hBit1 = LoadBitmap(hInst, "C:\New folder (2)\MyBP1.bmp");
break;
case WM_LBUTTONDOWN:
DC = GetDC(hwnd);
memDC = CreateCompatibleDC(DC);
SelectObject (memDC, hBit1);
BitBlt(DC, LOWORD(lParam), HIWORD(lParam), 27, 59, memDC, 0, 0, SRCCOPY);
ReleaseDC(hwnd, DC);
DeleteDC(memDC);
break;
Run Code Online (Sandbox Code Playgroud)
我不确定代码究竟是什么问题.在Visual c ++ express中没有显示错误如果代码完全错误,有人会指出我正确的方向
我在ArrayList中存储了一些位图,因为Bitmaps是非常昂贵的资源我想知道是否有一种有效的方法来释放所有Bitmaps,当我不再需要ArrayList或者只是在ArrayList上调用clear就足够了?