Android - Picasso 2.5.2 - display watermark - java

I've been trying to display a watermark on the images loaded with Picasso. I found this: Picasso - transformation bitmap quality , which is interesting to load the overlaid image using the .transform property, but I cannot find the BitmapTransformations.OverlayTransformation library anywhere.
For context sake, I'm loading a GridView and populating it with Picasso, like this:
MainActivity:
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
On ImageAdapter:
Picasso picasso = Picasso.with(mContext);
picasso.load(foto.getURL())
.placeholder(R.raw.place_holder)
.error(R.raw.big_problem)
.resize(150, 150)
.centerCrop()
.into(imageView);
On layout XML:
the GridView is within a RelativeLayout
I'd appreciate any help! Thanks
ps: this is how it's used on the link:
Picasso.with(context)
.load(item.getPicture())
.transform(new BitmapTransformations.OverlayTransformation(
context.getResources(), R.drawable.ic_play_video))
.error(R.drawable.picture_placeholder)
.into(target);

Try this for adding watermark text to your images with a picasso transformation:
https://gist.github.com/odedhb/4c72b1d73ddd7ece1949

Related

Image doesn't load using glide

I am using glide for image loading but I don't know what's problem with my glide
I add image for reference. ➡️ Glide Error
I am trying to fetch images from url.
My Code :-
Glide.with(context)
.load(path)
.error(R.drawable.ic_launcher_background)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.into(imageView)

How can I show image set in android java?

I am trying to add an image into my app with java so I googled how to do this and seen I had to add
Context mContext;
Drawable myImage = mContext.getDrawable(R.drawable.my_image);
(That was all of the code they said I had to add) But when I run it I don't see my image I set to it. So how I would be able to show the image I set to it?
For a image to be displayed, you need to give a view for that . ie - ImageView
Add a ImageView in your main-layout.
Initialize that ImageView in the on create of your activity like
ImageView appImage = findViewById(R.id.your_image_View_id);
3.Then set an image to the image view like
appImage.setImageResource(R.drawable.your_image);
Hope this helps.
You just initialize the imageview from layout like below,
ImageView appImage = findViewById(R.id.your_image_View_id);
appImage.setImageDrawable(ContextCompat.getDrawable(getActivity(),R.drawable.ic_downarrow));
With new android API 22 getResources().getDrawable() is now deprecated. So now the best approach is to use only getDrawable() is using ContextCompat
Please follow the steps:
Step1: In your main_layout.xml, add an <ImageView ... tag give an id, let's say id is "imageView"
Step2: In your MainActivity.class onCreate() method, Initialize that ImageView as:
ImageView image = findViewById(R.id.imageView)
then,
Step3: assign your drawable as:
im.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, R.drawable.your_image_drawable));
If you are using a fragment, use:
im.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.your_image_drawable));
Hope it helps. Please update if it does.
ImageView appImage = findViewById(R.id.your_image_View_id);
In activity simply use setImageResource
appImage.setImageResource(R.drawable.ic_avatar);

The images not showing from SQLite when store it as URL

When retrieving the images from Firebase to SQlite it comes as link, so I am trying now to show the images through Picasso as the following:
Picasso.with(context).load(favoritesList.get(position).getFoodImage())
.into(viewHolder.food_image);
but the image not showing. why its not showing? and how can i solve this issue?
Try this code and used Glide it is latest ..
add below dependency into app level gradle file..
implementation 'com.github.bumptech.glide:glide:4.7.1'
and make sure your path is not empty for give firebase server ..
Glide.with(context).load(favoritesList.get(position).getFoodImage())
.into(viewHolder.food_image);
and adapter define constructor like below ..
public RecyclerViewAdpater(List<String> mStringList, Context mContext) {
this.mStringList = mStringList;
this.mContext = mContext;
}
You are using old library try this,
In Gradle
implementation 'com.squareup.picasso:picasso:2.71828'
In Java
Picasso.get()
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
See more details Here.
Set Image from URL using Picasso like this
Picasso.with(context)
.load(favoritesList.get(position).getFoodImage())
.resize(width,height).into(viewHolder.food_image);
OR
Load Image from direct URL
URL url = new URL(favoritesList.get(position).getFoodImage().toString());
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
viewHolder.food_image.setImageBitmap(bmp);
Hope this may help you

Glide not updating image android of same url?

I have the same url for an image. When I update this image more than one time it shows the previous image. The image and picture version on the server is updated but Glide is not showing the new image.I want to get new image every time and cache it .
Glide.with(context)
.load(Constants.COPY_LINK_BASE_URL + info.getDisplayPicture())
.placeholder(R.drawable.ic_profile).dontAnimate()
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.signature(new (SettingManager.getUserPictureVersion(context)))
.into(ivUserProfilePhoto);
I can reproduce this bug by changing internet ,on one internet its change image as expected on other internet it remain same after 2 or 3 tries to changing image
//Use bellow code, it work for me.Set skip Memory Cache to true. it will load the image every time.
Glide.with(Activity.this)
.load(theImagePath)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(myImageViewPhoto);
Glide 4.x
Glide.with(context)
.load(imageUrl)
.apply(RequestOptions.skipMemoryCacheOf(true))
.apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
.into(imageView);
Glide 3.x
Glide.with(context)
.load(imageUrl)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
TL;DR.
you can skip caching by adding the following lines:
GLIDE v4
Glide.with(context)
.load(url)
.apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
.apply(RequestOptions.skipMemoryCacheOf(true))
.into(imageView);
GLIDE v3
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(imageView);
OR : you can workaround caching by adding a dummy random argument to your URL:
Glide.with(context)
.load(url + "?rand=" + (new Random().nextInt()))
.into(imageView);
What's happening?
When your picture is loaded the first time, it's stored locally in what's called a cached memory (or simply "a cache"). When you request it for a second time Glide fetches if from the cache as if it was a successful request. This is meant for many good reasons such as: offloading your server, saving your users some data and responding quickly (offering your users a smooth experience).
What to do?
Now, concerning your issue: you need to disable the cache in order to force Glide to fetch your image remotely every time you ask for it. You can do the following:
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.signature(imageVersion) // supposing that each new image has its own version number
.into(imageView);
Or, in the case where you can't know when a picture is changes (no imageVersion), use a unique signature for each picture.
Glide.with(context)
.load(url)
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
.into(imageView);
Another clean way would be to configure your picture's cache strategy in your server and use .diskCacheStrategy(DiskCacheStrategy.SOURCE).
A hacky trick worth mentioning
If adding a dummy GET paramter to your target URL doesn't break anything, then you could simply workaround caching by passing a random argument each time you fetch the image, this will push Glide to think you're querying a new endpoint, since the image cannot possibly exist in the cache.
Glide.with(context)
.load(url + "?rand=" + (new Random().nextInt())) // "&rand=" if your url already has some GET params
.into(imageView);
Glide caching API here.
I my case Glide not recognize .signature(), so additionally to #MGDavies's answer you maybe need something like this
// in kotlin
Glide.with(context)
.load("url")
//using apply to RequestOptions instead signature directly
.apply(RequestOptions().signature(ObjectKey("time that image was updated")))
.into(thumb)
This is an old question, so I'm sure you've got your fix by now. However I believe both of the big libraries(Picasso and Glide) now support something similar.
Glide has its signature API you may wish to look into:
https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation
Glide.with(yourFragment)
.load(yourFileDataModel)
.signature(new StringSignature(yourVersionMetadata))
.into(yourImageView);
I've not had a chance to work with this myself, but it looks as though you need to make a call to your API to get the version Metadata, then a subsequent call to fulfil it.
Alternatively, look into ETags.
Good luck!
Glide 4.8.0
Glide.with(mContext).asBitmap()
.load(nopicUrl)
.apply(RequestOptions.skipMemoryCacheOf(true))
.apply(RequestOptions.signatureOf(new ObjectKey(String.valueOf(System.currentTimeMillis()))))
.apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA))
.into(ivImageView);
Now Glide latest version, you have to use RequestOption for clear cache.
RequestOptions options = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true);
Or for everytime load picture you have to use a String in as signature.
RequestOptions options = new RequestOptions()
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())));
Finally:
Glide.with(CompressSingleActivity.this)
.applyDefaultRequestOptions(options)
.load(currentFile)
.into(currentImageView);
When new images are loaded or updated, use below to clear Glide memory and cache :
|==| Clear Glide memory
Glide.get(getApplicationContext()).clearMemory();
|==| Clear Glide Cache()
void clearGlideDiskCache()
{
new Thread(new Runnable()
{
#Override
public void run()
{
Glide.get(getApplicationContext()).clearDiskCache();
}
}).start();
}
diskCacheStrategy and skipMemoryCache did not work for my case.
I was writing to a local image file between Glide requests with the same url. My hack of a solution was to switch between adding a 0/1 to the end of the filename.
Forcing it to change image source every time seems to work.
Try using RequestOptions:
RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.ic_placeholder);
requestOptions.error(R.drawable.ic_error);
Glide.with(context)
.setDefaultRequestOptions(requestOptions)
.load(url).into(holder.imageView);
If .setDefaultRequestOptions(requestOptions) does not work, use .apply(requestOptions):
Glide.with(MainActivity.this)
.load(url)
.apply(requestOptions)
.into(imageview);
// or this
Glide.with(MainActivity.this)
.load(url)
.apply(new RequestOptions().placeholder(R.drawable.booked_circle).error(R.drawable.booked_circle))
.into(imageview);
// or this
Glide.with(MainActivity.this)
.load(url)
.apply(RequestOptions.placeholderOf(R.drawable.booked_circle).error(R.drawable.))
.into(imageview);
it's like the issue is related to Glide Library itself, I found the trick that can fix this, just put a random number after your image URL as a query like an Example code below, it fixed my problem I hope it helps you too
Random random = new Random();
int randomInt = random.nextInt();
Glide.with(context)
.applyDefaultRequestOptions(new RequestOptions()
.circleCrop().diskCacheStrategy(DiskCacheStrategy.NONE))
.load(ConstantVars.BaseUrl + userModel.getAvatarURL() + "?" + randomInt)
.apply(new RequestOptions().error(R.drawable.himart_place_holder))
.into(imageViewProfile);
it will make Glide to reload image anytime you request like there's no cache at all to read from.

UrlImageViewHelper resize image with ImageView size

I'm using UrlImageViewHelper, I would like to use less memory. So I thought about resizing image downloaded and fit with imageView size (more or less small depending on screen). Is it possible?
Here is my code :
UrlImageViewHelper.setUrlDrawable(mImageReport, mCurrentReportString.getUrlImages());
U can use [ https://github.com/square/picasso ] to load and cache, resize Image from Image Url .
Picasso.with(getActivity())
.load(imageUrl)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(screenWidth, imageHeight)
.centerInside()
.into(imageView);

Categories