Bitmap::FromResource 读取资源ID失败

今天读取资源的时候Bitmap* pBitmap = Bitmap::FromResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nId));  pBitmap == NULL;总是读取失败,

这里的资源是图片资源,我自定义的"IMAGE"

后来差了资料是,应该是

BOOL CXXXApp::InitInstance()

{

    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

}

int CXXXApp::ExitInstance()
{
  GdiplusShutdown(gdiplusToken);

  return COleControlModule::ExitInstance();
}

 

上面虽然能读取,但是图像显示不出来;最后改用下面

typedef std::map<UINT, Bitmap*> BitmapMap; 

BitmapMap   m_Map;

void AddItem(UINT nId)
{
 //Bitmap* pBitmap;
 //ImageFromIDResource(nId, _T("IMAGE"), pBitmap);

 //Bitmap* pBitmap = Bitmap::FromResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nId));
 //m_Map[nId] = pBitmap;

 Bitmap* pBitmap;
 ImageFromIDResource(nId, _T("IMAGE"), pBitmap);
 m_Map[nId] = pBitmap;
}

 


BOOL ImageFromIDResource(UINT nID, LPCTSTR szType, Bitmap* &pImg)
{
 HINSTANCE hInst = AfxGetResourceHandle();
 HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nID), szType);
 if (!hRsrc) return FALSE;
 // load resource into memory
 DWORD len = SizeofResource(hInst, hRsrc);
 BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
 if (!lpRsrc)
 return FALSE;
 // Allocate global memory on which to create stream
 HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
 BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
 memcpy(pmem,lpRsrc,len);
 IStream* pstm;
 CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
 // load from stream
 pImg = Bitmap::FromStream(pstm);
 // free/release stuff
 GlobalUnlock(m_hMem);
 pstm->Release();
 FreeResource(lpRsrc);
 return TRUE;
}

 

### 获取 AndroidImageView 当前设置的图片资源 ID 在 Android 开发中,获取 `ImageView` 当前显示的图片资源 ID 是一项常见的需求。以下是几种实现方式及其适用场景: #### 方法一:通过反射机制获取 Drawable 的资源 ID 如果图片是从 `res/drawable/` 文件夹加载到 `ImageView` 中,则可以通过反射的方式获取其对应的资源 ID。 ```java import android.content.res.Resources; import java.lang.reflect.Field; public int getDrawableResourceId(ImageView imageView) { Drawable drawable = imageView.getDrawable(); if (drawable != null && !drawable.isMutable()) { String resourceName = drawable.toString().split("#")[0].split(":")[1]; try { Field field = R.drawable.class.getField(resourceName); return field.getInt(null); } catch (Exception e) { e.printStackTrace(); } } return -1; // 如果未找到对应资源则返回 -1 表示失败 } ``` 此方法适用于从 `R.drawable` 加载的静态资源[^2]。 --- #### 方法二:利用 Tag 属性存储图片名称或 ID 开发者可以手动为 `ImageView` 设置一个 `Tag` 来保存图片的相关信息(如图片名或资源 ID)。这种方式更加灵活且可靠。 ```java // 设置 Tag imageView.setImageResource(R.drawable.example_image); imageView.setTag(R.drawable.example_image); // 获取 Tag int imageResourceID = (int) imageView.getTag(); if (imageResourceID != 0) { Log.d("ImageResource", "Current Image Resource ID: " + imageResourceID); } else { Log.e("ImageResource", "No resource ID found."); } ``` 这种方法依赖于开发者的主动管理,在动态更新图片时需同步更新 `Tag` 值[^4]。 --- #### 方法三:基于 MVVM 架构绑定数据源 当项目采用 MVVM 设计模式时,可以直接从 ViewModel 中读取当前绑定的数据源来获取图片资源 ID。 例如,在 XML 布局文件中定义如下: ```xml <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:imageSrc="@{viewModel.imageRes}" /> ``` 而在 Java 或 Kotlin 代码中可以从 ViewModel 提供的方法中访问该值: ```kotlin val currentImageResId = viewModel.imageRes.value ?: -1 Log.d("ViewModelData", "Current Image Res ID from VM: $currentImageResId") ``` 这种方案适合现代架构下的应用开发[^3]。 --- #### 注意事项 需要注意的是,并不是所有的 `Drawable` 都能映射回具体的资源 ID。例如,对于通过网络下载并展示在 `ImageView` 上的 Bitmap 图片或者经过修改后的可变对象 (`mutable`) ,上述方法可能无法正常工作。因此建议仅针对本地静态资源使用这些技术。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值